zoukankan      html  css  js  c++  java
  • DAG 上的 DP&环形DP

    DAG 上的 DP&环形DP

    例1:Naptime

    https://www.luogu.com.cn/problem/SP283

    解答详见蓝书

    简化问题——每天从第1小时开始,到第N小时结束,线性

    然后再强制第1小时和第N小时都睡觉,再dp一遍

    最后取max

    滚动数组滚掉一维

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int N=4000;
    int f[2][N][2],n,m,a[N],ans;
    
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) 
            scanf("%d",&a[i]);
        memset(f,0xcf,sizeof(f));
        f[1][1][1]=f[1][0][0]=0;
        for(int i=2;i<=n;i++)
            for(int j=0;j<=m;j++) {
                f[i&1][j][0]=max(f[(i-1)&1][j][0],f[(i-1)&1][j][1]);
                if(j>=1) f[i&1][j][1]=max(f[(i-1)&1][j-1][1]+a[i],f[(i-1)&1][j-1][0]);
            }
        ans=max(f[n&1][m][1],f[n&1][m][0]);
        memset(f,0xcf,sizeof(f));
        f[1][1][1]=a[1];
        for(int i=2;i<=n;i++)
            for(int j=0;j<=m;j++) {
                f[i&1][j][0]=max(f[(i-1)&1][j][0],f[(i-1)&1][j][1]);
                if(j>=1) f[i&1][j][1]=max(f[(i-1)&1][j-1][1]+a[i],f[(i-1)&1][j-1][0]);
            }
        ans=max(ans,f[n&1][m][1]);
        printf("%d
    ",ans);
        return 0;
    }
    
    

    例2:巴比伦塔 The Tower of Babylon

  • 相关阅读:
    5.5,5.6
    5.1,5.2
    第四章.编程练习
    多源最短路径--flody算法
    Java 面试题
    python 打包exe程序
    sql优化
    二叉树
    todo: 队列、栈、散列集
    java注解
  • 原文地址:https://www.cnblogs.com/ke-xin/p/13509515.html
Copyright © 2011-2022 走看看