1. 程式人生 > >演算法學習——動態規劃 例題:最長遞增子序列(java)

演算法學習——動態規劃 例題:最長遞增子序列(java)

給定陣列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));
    }
}