第一題明顯的動態規划,但是我只是在頭一天看過,雖然后面也絞盡腦汁寫出一個帶約束的背包問題,但是那也是在參考別人代碼的情況下寫出來的。明白題目的意思就花了我過半的時間
第二天突然就明白自己錯在哪里了。
n個產品m個零件加工問題Aij為第i個產品第j個零件加工所需要的時間,想要加工Aij必須先加工Ai-1,j和Ai,j-1
當時疑惑這個21.999999怎么來的,題目里隱藏的信息是零件可以同時加工,只要它的前置條件滿足就行,然后就是這條數據了真的看了很久才明白。比如說,我們要生產第二個產品。需要生產第一個產品,這里的第一個產品第二個零件和第二個產品第一個零件可以同時加工,因此總的花費時間就為10 + 5 + 3
輸入
2 4
10.00000 5.000000
4.500000 3.000000
4.499999 2.000000
2.000000 1.000000
輸出
21.999999
首先存數據,因為題目說第i個嘛,所有我都把下標加1了
Scanner scanner = new Scanner(System.in); int m= scanner.nextInt(); // 零件 int n = scanner.nextInt(); //產品 float[][] A = new float[n+1][m+1]; float count = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ A[i+1][j+1] = scanner.nextFloat(); } }
其實題目的意思,我們也可以知道狀態轉移方程
time[i][j] = Math.max(time[i-1][j], time[i][j-1])+A[i][j]
因為我沒學過算法,所以在這里被題目給迷惑了,我當時寫的是
time[i][j] = Math.min(time[i][j-1]+time[i-1][j] + A[i][j], time[i][j])
加上初始條件
public static float def(float[][] s){ //5 3 s[0][0] = 0; s[0][1] = 0; s[1][0] = 0; float[][] time = new float[s.length][s[0].length]; for (int i = 1; i < s.length; i++) { for (int j = 1; j < s[0].length; j++) { time[i][j] = Math.max(time[i][j - 1],time[i - 1][j])+s[i][j]; } } return time[s.length-1][s[0].length-1]; }