求救
查看原帖
求救
1198194
zlqwq楼主2025/6/27 20:55
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[1005];
int b[1005];
int c[1005];
int dp[1001][3][1001];
int win(int x){//谁能赢他 
	if(x==0)return 1;
	if(x==1)return 2;
	if(x==2)return 0;
}
int lose(int x){//谁能输他 
	if(x==0)return 2;
	if(x==1)return 0;
	if(x==2)return 1; 
}
int pk(int x,int y,int i){
	if(x==y)return a[i];
	if(x==win(y))return 2*a[i];
	if(x==lose(y))return 0;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
		b[i]+=b[i-1];
	}
	for(int i=1;i<=n;i++){
		cin>>c[i];
	}
	dp[1][win(c[1])][0]=2*a[1];
	dp[1][c[1]][0]=a[1];
	dp[1][lose(c[1])][0]=0;
	for(int i=2;i<=n;i++){
		for(int j=0;j<3;j++){
			for(int k=0;k<n;k++){
				int mx=max(dp[i-1][0][k-1],max(dp[i-1][1][k-1],dp[i-1][2][k-1]));
				int po;
				if(mx==dp[i-1][0][k-1])po=0;
				if(mx==dp[i-1][1][k-1])po=1;
				if(mx==dp[i-1][2][k-1])po=2;
				dp[i][j][k]=max(dp[i-1][j][k]+pk(j,c[i],i),dp[i-1][po][k-1]+pk(j,c[i],i));
			}
		}
	}
	int ans=0;
	for(int j=0;j<3;j++){
		for(int k=0;k<n;k++){
			ans=max(ans,dp[n][j][k]-b[k]);
		}
	}
	cout<<ans;
	return 0;
}
//考虑dp
//dp[i][j][k]表示第i轮,出了j,换了k此手牌的最大得分
//讲实话:dp[1][win][0]=2*a[1]
//        dp[1][ping][0]=a[1]
//        dp[1][lose][0]=0
//转移:   dp[i][j][k]=max{dp[i-1][j][k]+pk(j,c[i])}不换牌
//                       {dp[i-1][max(0,1,2)][k-1]+pk(j,c[i])} 
//求答案:-b[i]的前缀和一直到k即可??????? 
2025/6/27 20:55
加载中...