70分求助
查看原帖
70分求助
588201
hh20080501hh楼主2024/1/29 12:30

去官网上看了一下,与标程代码思路一模一样,但是调不出来。

以下是代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1010;

int n;
int a[N] , b[N] , c[N];
int dp[N][3][N];	//dp[i][0][j]表示第i轮当前手牌是0换了j次牌的最大分数,其余同理

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	
	cin >> n;
	for (int i=1 ; i<=n ; i++)
	{
		cin >> a[i];
	}
	for (int i=2 ; i<=n ; i++)
	{
		cin >> b[i];
	}
	for (int i=1 ; i<=n ; i++)
	{
		cin >> c[i];
	}
	
	for (int i=1 ; i<=n ; i++)
	{
		for (int j=i ; j>=1 ; j--)
		{
			if (c[i]==0)
			{
				dp[i][0][j] = max(dp[i-1][0][j] , max(dp[i-1][1][j-1]-b[j] , dp[i-1][2][j-1]-b[j]))+a[i];
				dp[i][1][j] = max(dp[i-1][0][j-1]-b[j] , max(dp[i-1][1][j] , dp[i-1][2][j-1]-b[j]))+2*a[i];
				dp[i][2][j] = max(dp[i-1][0][j-1]-b[j] , max(dp[i-1][1][j-1]-b[j] , dp[i-1][2][j]));
			}
			else if (c[i]==1)
			{
				dp[i][0][j] = max(dp[i-1][0][j] , max(dp[i-1][1][j-1]-b[j] , dp[i-1][2][j-1]-b[j]));
				dp[i][1][j] = max(dp[i-1][0][j-1]-b[j] , max(dp[i-1][1][j] , dp[i-1][2][j-1]-b[j]))+a[i];
				dp[i][2][j] = max(dp[i-1][0][j-1]-b[j] , max(dp[i-1][1][j-1]-b[j] , dp[i-1][2][j]))+2*a[i];
			}
			else 
			{
				dp[i][0][j] = max(dp[i-1][0][j] , max(dp[i-1][1][j-1]-b[j] , dp[i-1][2][j-1]-b[j]))+2*a[i];
				dp[i][1][j] = max(dp[i-1][0][j-1]-b[j] , max(dp[i-1][1][j] , dp[i-1][2][j-1]-b[j]));
				dp[i][2][j] = max(dp[i-1][0][j-1]-b[j] , max(dp[i-1][1][j-1]-b[j] , dp[i-1][2][j]))+a[i];
			}
//			cout << i << " " << dp[i][0][j] << " " << dp[i][1][j] << " " << dp[i][2][j] << " " << j << endl;
		}
	}
	
	int res = -0x3f3f3f3f;
	for (int i=1 ; i<=n-1 ; i++)
	{
		res = max(max(dp[n][0][i] , res) , max(dp[n][1][i] , dp[n][2][i]));
//		cout << dp[n][0][i] << " " << dp[n][1][i] << " " << dp[n][2][i] << endl;
	}
	cout << res << endl;
	return 0;
}
2024/1/29 12:30
加载中...