九度OJ-1131-合唱队形

来源:互联网 发布:世界博览怎么样知乎 编辑:程序博客网 时间:2024/06/03 15:57

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);



0 0
原创粉丝点击