hdu1024 dp
题意:求一个序列中的最大 m 段和,m 段不能交叉。
dp[i][0/1][j] 表示已经取完第 i 个物品,第 i 个物品取或不取,取到第 j 个子段。
用vis[i][0/1][j] 表示该 dp 值是否存在。
然后当 vis[i][0][j] 存在,即第 i 个物品不取,之前已经取了 j 个子段,可推得:
第 i+1 个不取: dp[i+1][0][j]=max(dp[i+1][0][j],dp[i][0][j]);
第 i+1 个取: dp[i+1][1][j+1]=max(dp[i+1][1][j+1],dp[i][0][j]+a[i]);
当 vis[i][1][j] 存在,即第 i 个物品取,之前已经取了 j 个子段(第 j 段可能还没有取完),可推得:
第 i+1 个不取: dp[i+1][0][j]=max(dp[i+1][0][j],dp[i][1][j]);
第 i+1 个取且放在第 j 个子段中: dp[i+1][1][j]=max(dp[i+1][1][j],dp[i][1][j]+a[i]);
第 i+1 个取且放在第 j+1 个子段中: dp[i+1][1][j+1]=max(dp[i+1][1][j+1],dp[i][1][j]+a[i]);
然后初始化 dp[1][1][1]=a[1],dp[1][0][0]=0;
由于直接开 n*2*m 会MLE,所以将第一维滚动,2*2*m 就完全没有问题,复杂度 O(n*m);
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; typedef long long ll;
const int maxn=1e6+; int a[maxn];
int dp[][][];
bool vis[][][]; int main(){
int m,n;
while(scanf("%d%d",&m,&n)!=EOF){
for(int i=;i<=n;++i)scanf("%d",&a[i]);
memset(dp,,sizeof(dp));
memset(vis,,sizeof(vis));
dp[][][]=a[];
vis[][][]=;
dp[][][]=;
vis[][][]=;
for(int k=;k<n;++k){
int i=k&;
memset(vis[i^],,sizeof(vis[i^]));
for(int j=;j<=m;++j){
if(vis[i][][j]){
if(!vis[i^][][j]){
vis[i^][][j]=;
dp[i^][][j]=dp[i][][j];
}
else if(dp[i][][j]>dp[i^][][j])dp[i^][][j]=dp[i][][j];
if(!vis[i^][][j+]){
vis[i^][][j+]=;
dp[i^][][j+]=dp[i][][j]+a[k+];
}
else if(dp[i][][j]+a[k+]>dp[i^][][j+])dp[i^][][j+]=dp[i][][j]+a[k+];
}
if(vis[i][][j]){
if(!vis[i^][][j]){
vis[i^][][j]=;
dp[i^][][j]=dp[i][][j];
}
else if(dp[i][][j]>dp[i^][][j])dp[i^][][j]=dp[i][][j];
if(!vis[i^][][j]){
vis[i^][][j]=;
dp[i^][][j]=dp[i][][j]+a[k+];
}
else if(dp[i][][j]+a[k+]>dp[i^][][j])dp[i^][][j]=dp[i][][j]+a[k+];
if(!vis[i^][][j+]){
vis[i^][][j+]=;
dp[i^][][j+]=dp[i][][j]+a[k+];
}
else if(vis[i^][][j+]&&dp[i][][j]+a[k+]>dp[i^][][j+])dp[i^][][j+]=dp[i][][j]+a[k+];
}
}
}
int ans=-0x3f3f3f3f;
if(vis[n&][][m])ans=max(ans,dp[n&][][m]);
if(vis[n&][][m])ans=max(ans,dp[n&][][m]);
printf("%d\n",ans);
}
return ;
}
hdu1024 dp的更多相关文章
- HDU1024 DP的优化 最大M子段和问题
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu1024线性dp
/* dp[i][j]表示取第i个数时分成了j块 要么是将第i个数加入j块中的最后一块,要么是自成一块,加上前面j-1块的和 状态转移方程: dp[i][j]=max(dp[i-1][j]+a[i], ...
- HDU1024(DP)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU1024 Max Sum Plus Plus 【DP】
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu1024 Max Sum Plus Plus 滚动dp
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU1024 多段最大和 DP
题目大意: 在n个数,求不重复的m段中的数据总和的最大值 令dp[i][j]表示将前j个数分成 i 段时得到的最大值(必取到第 j 个数) 状态转移可列为 dp[i][j]=Max(dp[i][j-1 ...
- HDU1024 Max Sum Plus Plus(dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 #include<iostream> #include<vector> #i ...
- HDU1024 Max Sum Plus Plus (优化线性dp)
Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...
- 【hdu1024】简单dp
http://acm.hdu.edu.cn/showproblem.php?pid=1024 最大m字段和,题目就不多说了,经典dp 这题坑爹...首先不说明m的范围(n<=1000000),还 ...
随机推荐
- asp.net文件下载文件另存为
这是一个困惑已久的问题…… 首先,用<a>标签的href打开浏览器能解读的文件(如txt,jpg,pdf等),会自动打开,无法做到弹出另存为的效果. 其次,网上搜索了各种JS解决办法,包括 ...
- Wen前端性能优化
Web前端性能优化 一般说来Web前端指网站业务逻辑之前的部分,包括浏览器加载.网站视图模型.图片服务.CDN服务等.主要优化手段有优化浏览器访问.使用反向代理.CDN等. 一.浏览器访问优化 减少h ...
- mstsc连接服务器时如何避免每次在登陆窗口输入密码(rdp passwd decrypted )
http://blog.chinaunix.net/uid-1835840-id-2831518.html 我们经常需要连接很多服务器,或者服务器的ip经常变动.把连接的密码保存在rdp配置文件里,用 ...
- 为什么 input 元素能用 width 属性
前几天在是写网页的时候发现input可以设置宽高,很疑惑,上网查了之后发现: 简单的认为 input 就是 inline 元素是片面的.元素默认以何种 display 属性值显示出来,这个其实更多的时 ...
- ViewPager实现自动翻页功能 --转载出处找不到了,根据自己的理解写个随笔方便以后的记忆以及代码的共享,感谢给我启发的那位高手--第一次写博客哈
xml文件 textview 用于显示图片的标题 viewpager 用于实现翻页效果 <LinearLayout xmlns:android="http://schemas.andr ...
- php实现函数重载
java..net等强类型预言中都有方法重载,但是PHP是弱类型语言,不能确定参数的类型, 而且如果php定义的方法接收一个参数,调用的时候传入多个也不会有问题,所以不能进行重载. 但是我们可以通过p ...
- 【C编译器】MinGw安装与使用(调试问题待续)
不想装vs2005之类的,想要一个轻量级的C语言编译器,希望将焦点放在如何写好代码上: 本人信奉:代码质量是靠设计和检视保证的,不是靠调试: 1.安装MinGW http://www.mingw.or ...
- 远程联机linux主机
远程联机linux主机 推荐使用 ssh 如 ssh user@www.abc.com(ssh使用公钥+私钥非对称加密,数据传输安全,不要使用telnet) 传输文件:sftp 或者 scp 若想使 ...
- WordPress使用记录
主要记录WordPress4.7使用过程中遇到的一些问题及解决办法. 1.无法显示主题列表 问题:新的版本主题管理页面是只显示当前主题的,无法进行管理. 解决:修改php.ini文件,参考这里.
- linux中模块的构建,传参,和printk函数的简单使用
静态编译,动态加载应用想访问内核需要通过系统调用 驱动:1.模块(打包,加入内核)2.内核机制3.操作硬件 在Kconfig里面配置menuconfig的时候,不同的类型会在图形化界面的终端显示不用的 ...