• POJ 2228 Naptime(DP+环形处理)


    题解

    这题一眼望去DP。

    发现自己太智障了。

    这题想的是O(n^3m)的。

    环形处理只会断环成链。。。。然后DP也想的不好。

    我们先考虑如果除去环这题该怎么做?

    dp[i][j][0/1]代表到第i小时睡了j个小时,第i小时睡了/没睡权值最大值。

    初值

    dp[1][1][1]=dp[1][0][0]=0;dp[i][0][0]=0;其余都是负无穷。

    转移

    dp[i][j][1]=max(dp[i-1][j-1][0],do[i-1[j-1][2]+w[i]);

    dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j[1]);

    目标

    dp[n][m][1].dp[n][m][0];

    然后考虑环,我们发现我们少考虑的只是第一个小时和上一天最后一个小时都睡觉的情况。

    我们保证第一个小时和上一天最后一个小时都睡觉再做一次DP。

    初值

    dp[1][1][1]=a[1];dp[i][0][0]=0;其余都是负无穷。

    转一样

    目标

    dp[n][m][1]];

    这样我们做两次DP,就处理了环的情况。

    注意这题空间比较少,滚一下就好了

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 const int N=4000;
     8 const int INF=199999999;
     9 int n,m,a[N],dp[2][N][2],ans;
    10 int main(){
    11     scanf("%d%d",&n,&m);
    12     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    13     memset(dp,-63,sizeof(dp));dp[1][1][1]=dp[1][0][0]=0;
    14     for(int i=2;i<=n;i++){
    15         dp[i&1][0][0]=0;
    16         for(int j=1;j<=min(m,i);j++){
    17             dp[i&1][j][1]=max(dp[i&1^1][j-1][1]+a[i],dp[i&1^1][j-1][0]);
    18             dp[i&1][j][0]=max(dp[i&1^1][j][0],dp[i&1^1][j][1]);
    19         }
    20     }
    21     ans=max(dp[n&1][m][0],dp[n&1][m][1]);
    22     memset(dp,-63,sizeof(dp));dp[1][1][1]=a[1];
    23     for(int i=2;i<=n;i++){
    24         dp[i&1][0][0]=0;
    25         for(int j=1;j<=min(m,i);j++){
    26             dp[i&1][j][1]=max(dp[i&1^1][j-1][1]+a[i],dp[i&1^1][j-1][0]);
    27             dp[i&1][j][0]=max(dp[i&1^1][j][0],dp[i&1^1][j][1]);
    28         }
    29     }
    30     printf("%d",max(ans,dp[n&1][m][1]));
    31     return 0;
    32 } 
  • 相关阅读:
    AC自动机+全概率+记忆化DP UVA 11468 Substring
    java POI技术之导出数据优化(15万条数据1分多钟)
    验证IP端与数据库Ip端是否重复!!!
    JAVA中IP和整数相互转化(含有掩码的计算)
    Nginx搭建反向代理服务器过程详解
    session原理及实现共享
    Linux部署多个tomcat
    linux下怎么修改mysql的字符集编码
    linux yum 安装mysql
    VM虚拟机下的Linux不能上网
  • 原文地址:https://www.cnblogs.com/Xu-daxia/p/9746827.html
Copyright © 2020-2023  润新知