P1091 合唱隊形(dp)

https://www.luogu.org/problemnew/show/P1091

題意就是求最長的先上升後下降的子序列(可以不上升也可以不下降)。

這道題給我個深刻的教訓,好好看題!!好好看題!!原本理解錯了,以爲要對稱的上升和下降,WA出一片天。

	#include<bits/stdc++.h>
	using namespace std;
	int a[106],b[106],dp[106],d[106];
	int main()
	{
		int n;
		cin>>n;
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
			b[n-1-i]=a[i];
			dp[i]=d[i]=50000;
		}
		int ans=0;
		for(int i=0;i<=n;i++)//n比較小,可以一個一個位置試試那個是中間的轉折點。
		{
			for(int j=0;j<i;j++)
			{
				*lower_bound(dp,dp+i,a[j])=a[j];
			}
			for(int j=0;j<n-i;j++)
			{
				*lower_bound(d,d+n-i,b[j])=b[j];
			}
			int w=lower_bound(dp,dp+i,50000)-dp;
			int e=lower_bound(d,d+n-i,50000)-d;
			ans=max(w+e,ans);
			for(int k=0;k<=n;k++)
			{
				dp[k]=d[k]=50000;
			}
		}
		printf("%d\n",n-ans);
		return 0;
	 } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章