Algorithm 动态规划的最大递增子序列

Algorithm 动态规划的最大递增子序列,algorithm,dynamic-programming,Algorithm,Dynamic Programming,问题如下: 给定n个整数的序列L不一定不同,编写一个算法,计算最大长度的递增子序列: 我建立的递推方程如下: 我从0开始索引: If j = n opt(j) = 0 (base case) otherwise opt(j) = max j <i <= n such that Lj <Li = {opt(i) +1} 如果j=n opt(j)=0(基本情况) 否则opt(j)=max j这里有一个提示:算法中试图保留的循环不变量是一个变量,k=最长递增子序列开始的索引。因此,

问题如下: 给定n个整数的序列L不一定不同,编写一个算法,计算最大长度的递增子序列:

我建立的递推方程如下:

我从0开始索引:

If j = n opt(j) = 0 (base case)
otherwise opt(j) = max j <i <= n such that Lj <Li = {opt(i) +1}
如果j=n opt(j)=0(基本情况)

否则opt(j)=max j这里有一个提示:算法中试图保留的循环不变量是一个变量,k=最长递增子序列开始的索引。因此,在遍历整数序列[0…n]时,相应地递增k值。

//给定一个整数数组,找到最长递增子序列的长度并打印序列

int longsub (int a[], int len) {

    int localsum = 0;
    int i = 0;
    int begin = i;
    int localsublen = 1;
    int globalsunlen = 0;
    int end = i;

    for (i=1; i< len; i++)    {

        if (a[i] > a[i-1]) {
              localsublen++;
        }
        else {
            newbegin = i;
            localsublen = 1;
        }

        if (localsublen > globalsublen)    {
            begin = newbegin;
            end = i;
            globalsublen = localsublen;
        }
    }

    for (i=begin;i <= end; i++)    
        printf ("%d.\n",a[i]);


}
intlongsub(inta[],intlen){
int localsum=0;
int i=0;
int begin=i;
int localn=1;
int globalsunlen=0;
int end=i;
对于(i=1;ia[i-1]){
localn++;
}
否则{
纽贝金=i;
localn=1;
}
if(localsublen>globalsublen){
开始=新开始;
end=i;
globalsublen=localsublen;
}
}

对于(i =开始),为什么你要在O(n ^ 2)中运行的动态编程解决方案,其中已经存在可以在O(n log n)中完成的二进制搜索解决方案?我不认为这是正确的。例如,考虑[1,5,6,2,7],你的代码将得到[1,5,6],但实际上最优是[1,5,6,7]。
int longsub (int a[], int len) {

    int localsum = 0;
    int i = 0;
    int begin = i;
    int localsublen = 1;
    int globalsunlen = 0;
    int end = i;

    for (i=1; i< len; i++)    {

        if (a[i] > a[i-1]) {
              localsublen++;
        }
        else {
            newbegin = i;
            localsublen = 1;
        }

        if (localsublen > globalsublen)    {
            begin = newbegin;
            end = i;
            globalsublen = localsublen;
        }
    }

    for (i=begin;i <= end; i++)    
        printf ("%d.\n",a[i]);


}