题目:数组
在一个夜黑风高的晚上,有n(n <= 50)个小朋友在桥的这边,如今他们须要过桥,可是因为桥很窄,每次只容许不大于两人经过,他们只有一个手电筒,因此每次过桥的两我的须要把手电筒带回来,i号小朋友过桥的时间为T[i],两我的过桥的总时间为两者中时间长者。问全部小朋友过桥的总时间最短是多少。spa
输入:code
有序数组(自定为有序,实际任意,数组内的数字表明对应索引过桥的时长)、数组长度blog
输出:索引
累加最短的时间class
实现:im
public class 自底向上实现线性模型 { private static int minTime(int p[],int n){ int opt[] = new int[n+1]; for (int i = 0; i < n; i++) { opt[i] = p[i]; } int minTime = 0; // 没有人的状况下 if (n == 0) return 0; // 有一我的时,返回这我的的时间 if (n == 1) return p[n-1]; // 有两我的时,返回用时较多的人的时间 if (n == 2) return Math.max(p[n-1],p[n-2]); /** * 人数多于2时,采用动态规划的思想,将问题拆分 * 假设河的这一侧还剩一人,则派遣最快的人往返 * 假设河的这一侧还剩二人,先派遣花费时间最少的人过来,待这两人走后,花费时间此少的人过来携带最少的人一同回去 */ for (int i = 2; i < n; i++) { opt[i] = Math.min(opt[i-1]+p[0]+p[i],opt[i-2]+p[0]+p[i]+2*p[1]); minTime = opt[i]; } return minTime; } public static void main(String[] args) { System.out.println(minTime(new int[]{1,2,5,10,11},5)); } }