求调悬五关
查看原帖
求调悬五关
1053122
liruizhou_lihui楼主2024/9/9 21:22

dp方程有一点 垃圾 奇怪

#include<bits/stdc++.h>
using namespace std;
int n,a[10005];
int dp[1005];//第 i 个人为中心点的合唱队型 
int dp1[1005];//以第 i 个人为结尾的最长上升子序列
int dp2[1005];//以第 i 个人为开始的最长下降子序列 
//dp(1,2)[1~n]=1
//若a[i] > a[i-j] , 那么 dp1[i]=max(dp1[i],dp1[i-j]+1)
//若a[i] > a[i+j] , 那么 dp2[i]=max(dp2[i],dp2[i+j]+1)
// dp[i]=dp1[i]+dp2[i]-1

/*
8
186 186 150 200 160 130 197 220

*/
int main()
{
	
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		dp1[i]=1;
		dp2[i]=1;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i-1;j++)
		{
			if(a[i]>a[i-j])
			{
				dp1[i]=max(dp1[i],dp1[i-j]+1);
			}
		}
		dp[i]=dp1[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=n-i;j>=1;j--)
		{
			if(a[i]<a[i+j])
			{
				dp2[i]=max(dp2[i],dp2[i+j]+1);
			}
		}
		dp[i]+=dp2[i]-1;
	}
//	for(int i=1;i<=n;i++)
//	{
//		cout<<"dp1["<<i<<"]="<<dp1[i]<<"\n";
//		cout<<"dp2["<<i<<"]="<<dp2[i]<<"\n";
//		cout<<"dp["<<i<<"]="<<dp[i]<<"\n------------------------\n";
//	}
	sort(dp+1,dp+n+1);
	cout<<n-dp[n];
	return 0;
}
2024/9/9 21:22
加载中...