30pts,不是题解做法,但不知道为什么不对
查看原帖
30pts,不是题解做法,但不知道为什么不对
1232566
Wh1t3zZlo楼主2024/10/28 12:22
#include<iostream>
using namespace std;

const int N = 105;

int dp[N][2],a[N];

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}

	dp[1][1] = dp[1][0] = 1;

	for (int i = 2; i <= n; i++)
	{
		for (int j = 1; j < i; j++)
		{
			if (a[i] > a[j]) dp[i][0] = max(dp[j][0] + 1,dp[i][0]);
			else if (a[i] < a[j]) dp[i][1] = max(max(dp[j][1] + 1,dp[j][0]+1), dp[i][1]);
			else dp[i][1] = max(max(dp[j][0],dp[j][1]),dp[i][1]), dp[i][0] = max(dp[j][0],dp[i][0]);
		}
	}
	int ans = 0x3f3f3f3f;
	for(int i=1;i<=n;i++) ans=min(ans,n - max(dp[i][1], dp[i][0]));
	cout << ans;
	return 0;
}

dp[i][0]代表到达第i个时序列正在上升最多能排的人数,dp[i][1]代表已经经历过上升后正在下降最多能排的人数,if (a[i] > a[j]) dp[i][0] = max(dp[j][0] + 1,dp[i][0]);就是还在上升,else if (a[i] < a[j]) dp[i][1] = max(max(dp[j][1] + 1,dp[j][0]+1), dp[i][1]);从已经上升完正在下降转移,或者从还在上升,到达顶点后下降转移,else dp[i][1] = max(max(dp[j][0],dp[j][1]),dp[i][1]), dp[i][0] = max(dp[j][0],dp[i][0]);如果相等的话就和前面人数一样大

2024/10/28 12:22
加载中...