五大算法之动态规划

问题:一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列的长度。

抽象:找出这N个数的最长非降子序列的长度。

思路:使用动态规划递推法,若d(i)为前i个数的最长非降子序列的长度,那么它依赖于d(1)...d(i-1)的长度,求出d(i),又可往后求出d(i+1)...n。其状态转移方程为:d(i) = max{1, d(j)+1},其中j=1...i-1,A[j]<=A[i]。

代码如下:

package test;
 
/**
 * 动态规划求最长非降子序列问题
 * @author yanghang
 *
 */
public class Dongtaiguihua {
    /**
     * longest increasing subsequence
     * @param a
     * @return
     */
    public static int lis(int[] a) {
        // 统计当前阶段的最长非降子序列
        int len = 0;
        // 原始数列长度
        int n = a.length;
        // 当前状态
        int[] d = new int[n];
         
        for (int i = 0; i < n; i++) {
            d[i] = 1;
            for (int j = 0; j < i; j++) {
                //状态转移方程的实现
                if (a[j] <= a[i] && d[j] + 1 > d[i]) {
                    d[i] = d[j] + 1;
                }
            }
            if (d[i] > len) {
                len = d[i] ;
            }
        }
        return len;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = { 5, 3, 4, 8, 6, 7 };
        System.out.println(lis(a));
 
    }
 
}

猜你喜欢

转载自blog.csdn.net/u010227646/article/details/80015254