只有第一个点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;
}