演算法學習——動態規劃 例題:最長遞增子序列(java)
阿新 • • 發佈:2019-01-12
給定陣列arr,返回arr的最長遞增子序列長度。比如arr=[2,1,5,3,6,4,8,9,7]最長遞增子序列為, [1,3,4,8,9] ,所以返回這個子序列的長度為5,給定陣列arr, 返回arr的最長所以返回這個子序列的長度。比如arr=[2,1,5,3,6,4,8,9,7] 最長遞增子序列[1,3,4,8,9],所以返回這個子序列的長度為5 arr=[2,1,5,3,6,4,8,9,7] [1,3,4,8,9] dp[1,1,2,2,3,3,4,5,4] 思路:把問題化簡為子問題,求整個整個陣列的最長子序列,我可以先求前面少一個數的遞增子序列, 不斷遞減累加,反過來想就是動態規劃,先從arr最左邊開始也就是從arr[0]開始當計算arr[1]時只需找到 它前面比他小的遞增子序列最大的那一個就可以了,這就是關係狀態方程:dp[i]=max{dp[j]+1(0<=j<i,arr[j]<arr[i])} dp[i]表示在必須以arr[i]這個數結尾的情況下,arr[0....i]中最大遞增子序列長度
public class DTGH_LongIncreaseSonList { public int longincreaseSonList(int[] arr) { int[] dp=new int[arr.length]; dp[0]=1; //迴圈求dp中剩餘的值 for (int i = 1; i <arr.length ; i++) { //計算在arr[i]之前的所有比arr[i]小的數且子序列值最大的也就是 // 關係狀態方程:dp[i]=max{dp[j]+1(0<=j<i,arr[j]<arr[i])} int max=0; for (int j = i; j >=0 ; j--) { if (arr[j]<arr[i]&&dp[j]>max){ max=dp[j]; } } dp[i]=max+1; } Arrays.sort(dp); return dp[dp.length-1]; } public static void main(String[] args) { DTGH_LongIncreaseSonList a=new DTGH_LongIncreaseSonList(); int[] arr={2,1,5,3,6,4,8,9,7}; System.out.println(a.longincreaseSonList(arr)); } }