一個關於動態規劃的華為機試
阿新 • • 發佈:2019-01-02
題目記得不太清了,大概意思是:一個數組,都是正整數,最多連續取兩個,求如何取取得的數相加和最大。
這是一個比較基礎的動態規劃問題,可以按照常規的狀態遞推思路。 開闢陣列data[3][n], 令data[0][n] 表示陣列arr中第n個數不選,data[1][n]表示陣列arr中第n個數選,第n-1個數不選,data[2][n]表示第n和第n-1個數選了。這類問題主要推匯出遷移公式就好做了,見程式碼:
java 程式碼如下:
public class HWPro3 { public static void main(String arg[]){ int[] data = {1,9,1,9,9,9,9}; System.out.println(maxValue(data)); } public static int maxValue(int[] data){ int N = data.length; if(N<=2){ return (N==1)?data[0]:(data[0]+data[1]); } int[][] arr = new int[N][3]; arr[1][0] = data[0]; arr[1][1] = data[1]; arr[1][2] = data[0]+data[1]; for (int i = 2; i < N; i++) { //狀態遷移公式,動態規劃核心部分 arr[i][0] = max(arr[i-1][0], arr[i-1][1], arr[i-1][2]); //第i個數不選時 arr[i][1] = arr[i-1][0]+data[i]; //第i個數選,第i-1個數不選時 arr[i][2] = arr[i-1][1]+data[i]; //第i個數選,第i-1個數也選時 } return max(arr[N-1][0], arr[N-1][1],arr[N-1][2]); } public static int max(int a, int b){ return a>b?a:b; } public static int max(int a,int b,int c){ return a>b&&a>c?a:(b>c?b:c); } }