zoukankan      html  css  js  c++  java
  • SPOJ NAPTIME Naptime

    https://www.spoj.com/problems/NAPTIME/en/

    题目

    一天有n小时,有头牛,每n小时只能在床上呆B小时(不一定连续),在床上的第一小时还不能睡着,要第二小时开始才睡着,如果在第i小时的时候是睡着的,她就可以获得$U_i$点精力,先选择连续的n小时,然后在这n小时中选择不一定连续的B小时使她获得的精力最大,求最大值。

    3 <= N <= 3,830

    题解

    第一想法:拆成环,然后dp[a][b][c][2]表示从第a小时开始,现在是b小时,在床上呆了c小时,这时是否在床上,然后就肯定超时了

    其实有另外的做法

    直接在一天内dp,区别只是“最后一小时处于睡眠状态并且第一小时获得了精力”的真假,那么可以进行两次背包

    dp[i][j][0/1]表示现在是i,在床上呆了c小时,这时是否在床上

    那么很容易写出转移

    AC代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    #include<cassert>
    #define REP(i,a,b) for(register int i=(a); i<(b); i++)
    #define REPE(i,a,b) for(register int i=(a); i<=(b); i++)
    #define PERE(i,a,b) for(register int i=(a); i>=(b); i--)
    using namespace std;
    #define MAXN 3837
    int u[MAXN];
    int dp[2][MAXN][2]; //now B
    int main() {
    	int t; scanf("%d", &t);
    	while(0<t--) {
    		int n,b; scanf("%d%d", &n, &b);
    		REP(i,0,n) {
    			scanf("%d", &u[i]);
    		}
    		memset(dp,-0x3f,sizeof dp);
    		dp[0][0][0]=0; dp[0][1][1]=0;
    		int now=0;
    		REP(i,1,n) {
    			now^=1;
    			REPE(j,0,b) {
    				if(j) dp[now][j][1]=max(dp[now^1][j-1][0],dp[now^1][j-1][1]+u[i]);
    				dp[now][j][0]=max(dp[now^1][j][0],dp[now^1][j][1]);
    			}
    		}
    		int ans=max(dp[now][b][0],dp[now][b][1]);
    		now=0;
    		memset(dp,-0x3f,sizeof dp);
    		dp[0][1][1]=u[0];
    		REP(i,1,n) {
    			now^=1;
    			REPE(j,0,b) {
    				if(j) dp[now][j][1]=max(dp[now^1][j-1][0],dp[now^1][j-1][1]+u[i]);
    				dp[now][j][0]=max(dp[now^1][j][0],dp[now^1][j][1]);
    			}
    		}
    		ans = max(ans, dp[now][b][1]);
    		printf("%d
    ", ans);
    	}
    }
    
  • 相关阅读:
    Linux下简单的多线程编程--线程池的实现
    Nginx配置免费SSL证书StartSSL,解决Firefox不信任问题
    php100视频教程解压密码
    PDO防注入原理分析以及使用PDO的注意事项
    php mysql PDO使用
    禁用网页右键菜单和鼠标拖动选择
    php pdo和mysqli对比选择
    PHP-mac下的配置及运行
    550 5.7.1 Client does not have permissions to send as this sender
    Entity framework code first
  • 原文地址:https://www.cnblogs.com/sahdsg/p/12483587.html
Copyright © 2011-2022 走看看