洛谷P1091 合唱队形(dp)

题意简述:给一个序列,求最少去掉几个元素才能使得序列呈先上升后下降。

解题思路:设f1[ i ] 为以第 i 个元素为尾的最长上升子序列,f2[ i ]为以第 i 个元素为起点的最长下降子序列,于是答案就是最小的 n - f1[ i ] - f2[ i ] + 1;

代码示例:

#include
#include
using namespace std;
const int maxn = 150;
int h[maxn];
int f1[maxn],f2[maxn];
void solve(int n){
	for(int i = 0;i < n;i++){
		f1[i] = 1;
		for(int j = 0;j < i;j++){
			if(h[i] > h[j]) f1[i] = max(f1[i],f1[j]+1);
		}
	}
	for(int i = n-1;i >= 0;i--){
		f2[i] = 1;
		for(int j = n-1;j > i;j--){
			if(h[i] > h[j]) f2[i] = max(f2[i],f2[j]+1);
		}
	}
	int ans = 0x3f3f3f3f;
	for(int i = 0;i < n;i++)
		ans = min(ans,n-f1[i]-f2[i]+1);
	cout << ans << endl;
}
int main(){
	//freopen("123.in","r",stdin);
	int n;
	scanf("%d",&n);
	for(int i = 0;i < n;i++){
		scanf("%d",h+i);
	}
	solve(n);
	return 0;
}

 

你可能感兴趣的:(动态规划,假期练习)