P1091 合唱隊形 (DP&LIS)

P1091 合唱隊形 (DP&LIS)

題目傳送門

思路:顯然正反跑兩邊LIS,遍歷一遍取最值即可。時間複雜度:O(n^2) 不過可以用upper_bound()壓到O(nlogn)這裏就不寫這種做法了。。。。

AC代碼:

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int a[N],dp[2][N];//保存[1,n]和[n,1]的LIS 
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	dp[0][1]=dp[1][n]=1;
	for(int i=2,mx;i<=n;i++){ //正反跑兩邊LIS 
			mx=0;
		for(int j=1;j<i;j++)
			if(a[j]<a[i]&&dp[0][j]>mx)
				mx=dp[0][j];
		dp[0][i]=mx+1;
	}
	for(int i=n-1,mx;i>=1;i--){
			mx=0;
		for(int j=n;j>i;j--)
			if(a[j]<a[i]&&dp[1][j]>mx)
				mx=dp[1][j];
		dp[1][i]=mx+1;
	}
	int ans=0;
	for(int i=1;i<=n;i++)//遍歷一遍取最值. 
		ans=max(ans,dp[0][i]+dp[1][i]-1);
	printf("%d\n",n-ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章