• Codeforces 358D【DP】


    思路:

     dp[i][0] 代表取的时候左边没有
    dp[i][1] 代表取的时候右边没有
    dp[i][2] 代表取的时候左右都没有
    dp[i][3] 代表取的时候左右都有
    然后自己转移吧= =、

    注意两个区间端点:

     如果旁边有取a[i], 如果没有取b[i]。
     只有一个的时候取a[i]。。。。
    太狗了,这题意!
    #include<bits/stdc++.h>
    using namespace std;
    typedef __int64 LL;
    const int INF=0x3f3f3f3f;
    
    int dp[3005][4];
    int a[3005];
    int b[3005];
    int c[3005];
    
    void DP(int n)
    {
        if(n==1)
        {
            printf("%d
    ",a[1]);
            return;
        }
        memset ( dp , -0x3f , sizeof ( dp ) );
        dp[1][0]=a[1];
        dp[1][2]=b[1];
        dp[1][1]=-INF;
        dp[1][3]=-INF;
    
        for(int i=2;i<n;i++)
        {
            dp[i][0]=max(dp[i-1][0]+b[i],dp[i-1][3]+b[i]);
            dp[i][1]=max(dp[i-1][1]+b[i],dp[i-1][2]+b[i]);
            dp[i][2]=max(dp[i-1][0]+c[i],dp[i-1][3]+c[i]);
            dp[i][3]=max(dp[i-1][1]+a[i],dp[i-1][2]+a[i]);
        }
    
        dp[n][1]=max(dp[n-1][1]+a[n],dp[n-1][2]+a[n]);
        dp[n][2]=max(dp[n-1][0]+b[n],dp[n-1][3]+b[n]);
    
        printf("%d
    ",max(dp[n][1],dp[n][2]));
    }
    
    void solve()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&c[i]);
    
        DP(n);
    }
    
    int main()
    {
        solve();
        return 0;
    }
    /*
    4
    1 2 3 4
    4 3 2 1
    0 1 1 0
    */
    


  • 相关阅读:
    java 中 堆、栈的区别(转)
    斐波那契数列(关于递归)
    .NetCore使用Hangfire
    大话西游系统文件分析
    VC游戏开发图片镂空
    华硕XTion Pro开发环境配置
    TweenMax 参数说明(中文翻译)
    程序员的追求
    最近得到的
    mvc的json
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777483.html
Copyright © 2020-2023  润新知