http://ac.jobdu.com/problem.php?pid=1131
这是一道最长递增子序列加强版。
只需计算以a[i]为结尾的最长递增子序列,以a[i]为开头的最长递减子序列(这个实际就是逆序后的以a[i]为结尾最长递增子序列嘛!)
两个部分代码:
for(i=1;i<n;i++){
max=1;
for(j=0;j<i;j++){
if(a[i]>a[j] && f1[j]+1>max){
max=f1[j]+1;
}
}
f1[i]=max;
}
for(i=n-2;i>=0;i--){
max=1;
for(j=n-1;j>i;j--){
if(a[i]>a[j] && f2[j]+1>max){
max=f2[j]+1;
}
}
f2[i]=max;/
}
我一开始犯了一个错误:注意标记部分,我一开始写的是f2[i]=f2[i]+max-1;本意是直接计算出符合题意的序列总长度,然而这是不对的,因为f2[i]会影响到后面的计算。而且即使可以,f2[n-1]也是没有计算的.
最后这样处理就OK了。
for(i=0;i<n;i++){
f2[i]=f1[i]+f2[i];
}
max=f2[0];
for(i=1;i<n;i++){//找最大值
if(f2[i]>max)
max=f2[i];
}
printf("%d\n",n-max+1);