naptime
有一个长度为n的序列\(a_i\),首尾相接组成了一个环,现在要在这个环上选出若干个区间,使区间长度之和恰好为b,然后忽略区间的顺时针开头元素,权值累加区间中所有的数字,问权值的最大值,\(2 <= b < n <= 3830\)。
解
注意到问题是一个环,所以应该拆环成链,而且是区间选择的问题,特别的地方在于,区间选择要忽略开头元素,于是我们需要保存该个元素是否被选,
所以设\(f[i][j][0/1]\)分别表示选到第i个数前面已经选了j个数第i个数选与不选的最大权值,于是不难有
\]
\]
边界:\(f[0][0][0]=0\),其余负无限大。
答案:\(\max(f[n][b][0],f[n][b][1])\)
但是注意问题是一个环,而这只是一条链,于是还要联系环,暴力枚举拆哪个位置显然是不行的,但是注意到这个链所没考虑的环的情况,即第一个位置和最后一个位置是否联系起来了,于是我们可以暴力让其联系,把边界改成\(f[1][1][1]=a_1\),其余负无限大,然后二次递推,答案再考虑一个\(f[n][b][1]\)即可。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define intmax 0x7fffffff
using namespace std;
int u[3831],dp[3831][3831][2];
il void read(int&);
il int max(int,int);
int main(){
    int lsy;read(lsy);
    while(lsy--){
        int n,b,ans;
        read(n),read(b),memset(dp,-127,sizeof(dp));
        for(int i(1);i<=n;++i)read(u[i]);dp[0][0][0]=0;
        for(int i(1),j;i<=n;++i){
            dp[i][0][0]=dp[i-1][0][0];
            for(j=1;j<=i;++j)
                dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]),
                    dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j-1][1]+u[i]);
        }ans=max(dp[n][b][0],dp[n][b][1]),memset(dp,-127,sizeof(dp));
        dp[1][1][1]=u[1],dp[1][0][0]=0;
        for(int i(2),j;i<=n;++i){
            dp[i][0][0]=dp[i-1][0][0];
            for(j=1;j<=i;++j)
                dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]),
                    dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j-1][1]+u[i]);
        }ans=max(ans,dp[n][b][1]),printf("%d\n",ans);
    }
    return 0;
}
il int max(int a,int b){
    return a>b?a:b;
}
il void read(int &x){
    x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}
												
											naptime的更多相关文章
- SP283 NAPTIME - Naptime
		
SP283 NAPTIME - Naptime 题意: 在某个星球上,一天由N小时构成.我们称0-1点为第一个小时,1-2点为第二个小时,以此类推.在第i个小时睡觉能恢复Ui点体力.在这座星球上住着一 ...
 - poj2228 Naptime【(环结构)线性DP】
		
Naptime Time Limit: 1000MS Memory Limit: 65536K Total Submissions:3374 Accepted: 1281 Descriptio ...
 - poj 2228 Naptime(DP的后效性处理)
		
\(Naptime\) \(solution:\) 这道题不做多讲,它和很多区间DP的套路一致,但是这一道题它不允许断环成链,会超时.但是我们发现如果这只奶牛跨夜休息那么它在不跨夜的二十四个小时里一定 ...
 - [USACO2005][POJ2228]Naptime(对特殊环状DP的处理)
		
题目:http://poj.org/problem?id=2228 题意:将一天分为N小时,每小时都有一个价值w,有一头牛要睡觉,而它的睡觉是连续的,且第一小时不能算价值,即如果你睡了[a,b],则你 ...
 - BZOJ1737 [Usaco2005 jan]Naptime 午睡时间
		
断环然后裸DP就好了... $f[i][j][k]$表示1号时间段没有被算入答案,到了第$i$个时间段,一共选了$j$个时间段,$k = 0 /1$表示第i个时间段有没有被算进答案的最优值 $g[i] ...
 - poj 2228 Naptime dp
		
这个题目的状态还是比较好想的,dp[i][j]表示已经睡了i个时段,最后睡在j时段的最优值,但是需要处理环的情况,我的做法是算两次,第一次不处理环,第二次强制性要求第一个时段需要睡,然后查看dp[m] ...
 - 【SPOJ283】Naptime
		
题目大意:给定一个由 N 个点组成的环,点有点权,现从中选出 M 个点,对于顺时针方向来说,每一段被选取的第一个点的点权不计入答案贡献,求选出的最大权值是多少. 题解:首先考虑线性的情况,设 \(dp ...
 - POJ2228 Naptime
		
题目:http://poj.org/problem?id=2228 环形dp.开一维记录当前最后一份时间是否在睡.很精妙地分两类. 1.正常从1到n线性dp. 2.上边只有一种情况未覆盖:第一份时间就 ...
 - 【bzoj1737】[Usaco2005 jan]Naptime 午睡时间  dp
		
题目描述 Goneril is a very sleep-deprived cow. Her day is partitioned into N (3 <= N <= 3,830) equ ...
 
随机推荐
- [JZOJ 5129] 字符串
			
题意:统计本质不同的串的个数. 思路: 显然后缀自动机,对于每个串建一个\(SAM\)统计即可. #include <bits/stdc++.h> using namespace std; ...
 - markdown常用数学符号小结
			
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 markdown使用LaTex输入数学公式类 Markdown数学符号&公式 CSDN-MarkDown编辑器使用手册(4)- ...
 - c++ 实现元组 重载cout os 输出
			
#include <iostream> #include <string> using namespace std; class CAnyType //: public COb ...
 - 直接用编译器按ctrl+F5运行和双击运行结果不一样
			
是因为进程权限的问题,需要添加下面的代码: BOOL EnableDebugPrivilege() { HANDLE hToken; BOOL fOk=FALSE; if(OpenProcessTok ...
 - 基于Netty的RPC架构学习笔记(十):自定义数据包协议
			
文章目录 数据包简介 粘包.分包现象 数据包格式 举个
 - 9、从命令行运行postman脚本及生成测试报告
			
本节建议直接看postman官网:https://www.npmjs.com/package/newman 环境准备: 安装nodejs和npm 参考 https://www.runoob.c ...
 - 洛谷P3959——宝藏
			
传送门:QAQQAQ 题意: 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了$n$个深埋在地下的宝藏屋, 也给出了这$n$个宝藏屋之间可供开发的$m$条道路和它们的长度. 小明决心亲自前往挖掘所有 ...
 - 「LibreOJ NOI Round #2」签到游戏
			
题目 瞎猜一下我们只要\(n\)次询问就能确定出\(\{A_i\}\)来 感受一下大概是询问的区间越长代价就越小,比如询问\([l,n]\)或\([1,r]\)的代价肯定不会超过\([l,r]\) 所 ...
 - iOS开发系列-Charles
			
概述 Charles相当于一个插在服务器和客户端之间的"过滤器".当客户端向服务器发起请求的时候,先到charles进行过滤,然后charles在把最终的数据发送给服务器: 注意: ...
 - (转)lua protobuffer的实现
			
转自: http://www.voidcn.com/article/p-vmuovdgn-bam.html (1)lua实现protobuf的简介 需要读者对google的protobuf有一定的了解 ...