atcoder abc 438D

原题

(https://atcoder.jp/contests/abc438/tasks/abc438_d)
题目意思简单来说就是
给你三个数组
A 1 4 2 4 3
B 2 3 4 2 2
C 3 2 4 4 3
要求的是ABC中三个数组分别是蛇的头部,身体,尾巴
三个数组中每个数组都至少要被取走一次,不可以五个点全取A,或者有一个没被取过,因为不可以简单的就是取最大,要整体考虑,所以我们考虑dp

完整代码

void solve(){
    int n;cin>>n;
    vector<int>a(n+1),b(n+1),c(n+1);
    //dp[i][j]表示的是处理到了第i个位置,j表示状态
    /*
    0   还没开始选
    1在选a中的元素
    2在选b中的元素
    3在选c中的元素
    */
    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];
    vector<vector<int>>dp(n+1,vector<int>(4,-INF));
    dp[0][0]=0;
    for(int i=1;i<=n;i++){
        dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]+a[i]);
        dp[i][2]=max(dp[i-1][1]+b[i],dp[i-1][2]+b[i]);
        dp[i][3]=max(dp[i-1][2]+c[i],dp[i-1][3]+c[i]);
    }
    cout<<dp[n][3]<<endl;
}
posted @ 2026-03-28 15:23  Time_q  阅读(10)  评论(0)    收藏  举报