10pts,求条!
查看原帖
10pts,求条!
936561
wsgdsgqq楼主2024/8/2 15:39

只有第一个点A了

下面是代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1010;
int dp[N][N][3];
int d[N],o[N],op[N],n;
int main()
{
	memset(dp,-0x3f,sizeof dp);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&d[i]);
	for(int j=1;j<n;j++)
		scanf("%d",&o[j]);
	for(int i=1;i<=n;i++)
		scanf("%d",&op[i]);
	for(int i=1;i<=n;i++)
	{
		for(int k=0;k<n;k++)
		{
			if(op[i]==1)
			{
				dp[i][k][2]=dp[i-1][k][2]+2*d[i];
				dp[i][k][2]=max(dp[i][k][2],dp[i-1][k-1][0]-o[k]+2*d[i]);
				dp[i][k][2]=max(dp[i][k][2],dp[i-1][k-1][1]-o[k]+2*d[i]);
				dp[i][k][1]=dp[i-1][k][1]+d[i];
				dp[i][k][1]=max(dp[i-1][k-1][0]-o[k]+d[i],dp[i][k][1]);
				dp[i][k][0]=dp[i-1][k][0];
			}
			else if(op[i]==2)
			{
				dp[i][k][0]=dp[i-1][k][0]+2*d[i];
				dp[i][k][0]=max(dp[i][k][0],dp[i-1][k-1][2]-o[k]+2*d[i]);
				dp[i][k][0]=max(dp[i][k][0],dp[i-1][k-1][0]-o[k]+2*d[i]);
				dp[i][k][2]=dp[i-1][k][2]+d[i];
				dp[i][k][2]=max(dp[i-1][k-1][1]-o[k]+d[i],dp[i][k][2]);
				dp[i][k][1]=dp[i-1][k][1];
			}
			else//0
			{
				dp[i][k][1]=dp[i-1][k][1]+2*d[i];
				dp[i][k][1]=max(dp[i][k][1],dp[i-1][k-1][0]-o[k]+2*d[i]);
				dp[i][k][1]=max(dp[i][k][1],dp[i-1][k-1][2]-o[k]+2*d[i]);
				dp[i][k][0]=dp[i-1][k][0]+d[i];
				dp[i][k][0]=max(dp[i-1][k-1][2]-o[k]+d[i],dp[i][k][0]);
				dp[i][k][2]=dp[i-1][k][2];
			}
		}
	}
	int max1=0;
	for(int i=0;i<n;i++)
		for(int j=0;j<3;j++)
			max1=max(max1,dp[n][i][j]);
	printf("%d",max1);
	return 0;
}
2024/8/2 15:39
加载中...