思路
1.任意一轮出牌,只有三种选择
2.每一轮的得分只与当前一轮出的牌和上一轮出的牌相关
由此我们可以设 \(dp[i][j]\) 为第 \(i\) 轮,出牌 \(j\) 的得分
3.由于扣分机制,扣的分数与扣的次数有关,所以我们再加一层 \(dp\) 代表扣的次数
code,注意细节
#include<bits/stdc++.h>
using namespace std;
int dp[1005][4][1005]={0},a[1005]={0},b[1005]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)cin>>b[i];
for(int i=1;i<=n;i++)
{
int x,j;
cin>>x;
dp[i][0][0]=dp[i-1][0][0]+((x==2)?2*a[i]:((x==0)?a[i]:0));
dp[i][1][0]=dp[i-1][1][0]+((x==0)?2*a[i]:((x==1)?a[i]:0));
dp[i][2][0]=dp[i-1][2][0]+((x==1)?2*a[i]:((x==2)?a[i]:0));
for(j=1;j<i-1;j++)
{
dp[i][0][j]=max(dp[i-1][0][j],max(dp[i-1][1][j-1],dp[i-1][2][j-1])-b[j])+((x==2)?2*a[i]:((x==0)?a[i]:0));
dp[i][1][j]=max(dp[i-1][1][j],max(dp[i-1][0][j-1],dp[i-1][2][j-1])-b[j])+((x==0)?2*a[i]:((x==1)?a[i]:0));
dp[i][2][j]=max(dp[i-1][2][j],max(dp[i-1][0][j-1],dp[i-1][1][j-1])-b[j])+((x==1)?2*a[i]:((x==2)?a[i]:0));
}
//j=i-1时,dp[i-1][][i-1]是没有意义的
dp[i][0][j]=max(dp[i-1][1][j-1],dp[i-1][2][j-1])-b[j]+((x==2)?2*a[i]:((x==0)?a[i]:0));
dp[i][1][j]=max(dp[i-1][0][j-1],dp[i-1][2][j-1])-b[j]+((x==0)?2*a[i]:((x==1)?a[i]:0));
dp[i][2][j]=max(dp[i-1][0][j-1],dp[i-1][1][j-1])-b[j]+((x==1)?2*a[i]:((x==2)?a[i]:0));
}
int ans=0;
for(int i=0;i<=2;i++)
for(int j=0;j<n;j++)ans=max(ans,dp[n][i][j]);
cout<<ans<<endl;
return 0;
}
标签:GESP202312,int,P10111,七级,一轮,1005,dp
From: https://www.cnblogs.com/pure4knowledge/p/18015854