Algorithm 动态规划的最大递增子序列
问题如下: 给定n个整数的序列L不一定不同,编写一个算法,计算最大长度的递增子序列: 我建立的递推方程如下: 我从0开始索引: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=最长递增子序列开始的索引。因此,
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]);
}