C 被涂色的作文纸

区间dp,设dp[i][j][k][l]为区间[i,j]内且把左端点涂成k,右端点涂成l的最大分数。状态转移方程见代码

#include<bits/stdc++.h>
using namespace std;
int n,a[1005],b[1005],c[1005],dp[1005][1005][2][2];
int main(){
    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++)cin>>c[i];
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j++){
            if(i==j){
                dp[i][j][0][0]=a[i];
                dp[i][j][1][1]=b[i];
            }
            else{
                dp[i][j][0][0]=max(max(dp[i+1][j][1][0]+a[i],dp[i+1][j][0][0]+a[i]+c[i]+c[i+1]),max(dp[i][j-1][0][1]+a[j],dp[i][j-1][0][0]+a[j]+c[j]+c[j-1]));
                dp[i][j][1][0]=max(max(dp[i+1][j][1][0]+b[i]+c[i]+c[i+1],dp[i+1][j][0][0]+b[i]),max(dp[i][j-1][1][1]+a[j],dp[i][j-1][1][0]+a[j]+c[j]+c[j-1]));
                dp[i][j][0][1]=max(max(dp[i+1][j][1][1]+a[i],dp[i+1][j][0][1]+a[i]+c[i]+c[i+1]),max(dp[i][j-1][0][1]+b[j]+c[j]+c[j-1],dp[i][j-1][0][0]+b[j]));
                dp[i][j][1][1]=max(max(dp[i+1][j][1][1]+b[i]+c[i]+c[i+1],dp[i+1][j][0][1]+b[i]),max(dp[i][j-1][1][1]+b[j]+c[j]+c[j-1],dp[i][j-1][1][0]+b[j]));
            }
        }
    }
    cout<<max(max(dp[1][n][0][1],dp[1][n][1][1]),max(dp[1][n][1][0],dp[1][n][0][0]));
    return 0;
}