去官网上看了一下,与标程代码思路一模一样,但是调不出来。
以下是代码
#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;
}