您的位置:首页 > 其它

九度OJ-1131-合唱队形

2014-10-06 21:43 246 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: