博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HNU Sleeping at Work
阅读量:7008 次
发布时间:2019-06-28

本文共 1270 字,大约阅读时间需要 4 分钟。

题意:知道了每个时间段的休息可以获得能量,和连续休息可以获得的能量。求在能休息慢m 分钟,且最长连续时间段不超过 r 所能获得的最大能量值。

分析:dp[i][j][k] 表示到第 i 分钟休息了j 分钟,连续睡了k 分钟获得最大值。

#include
#include
#define max(a,b)(a)>(b)?(a):(b)#define clr(x)memset(x,0,sizeof(x))int dp[505][55][55];int a[505];int main(){ int t,i,j,k,n,m,r; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&r); a[0]=0; for(i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,-1,sizeof(dp)); for(i=0;i<=n;i++) dp[i][0][0]=0; for(i=1;i<=n;i++) for(j=1;j<=m&&j<=i;j++) { for(k=1;k<=r&&k<=j;k++) { if(dp[i-1][j-1][k-1]==-1) dp[i][j][k]=-1; else dp[i][j][k]=dp[i-1][j-1][k-1]+k*a[i]; if(dp[i-1][j][k]>dp[i][j][0]) dp[i][j][0]=dp[i-1][j][k]; } dp[i][j][0]=max(dp[i][j][0],dp[i-1][j][0]); } int res=-1; for(k=0;k<=r;k++) res=max(res,dp[n][m][k]); if(res==-1) printf("impossible\n"); else printf("%d\n",res); } return 0;}

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/09/02/2667520.html

你可能感兴趣的文章
无线网络IP地址冲突问题不再棘手
查看>>
我的友情链接
查看>>
域名扫描工具Fierce
查看>>
Zabbix WMI 监控
查看>>
关于for in和for循环的遍历
查看>>
完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
查看>>
JSP Struts之HTML标签库详解
查看>>
Hp服务器 raid 磁盘故障数据库数据恢复解决方案
查看>>
运维角度浅谈MySQL数据库优化
查看>>
【Spark亚太研究院系-构建Spark集群-配置Hadoop单机模式并运行Wordcount(2)
查看>>
Java通过POI为Excel添加数据验证
查看>>
修改vim的配色方案
查看>>
程矢Axure夜话:程序员眼中的原型设计视频教程之书到用时方恨少
查看>>
网站降权怎么办
查看>>
esxi 4.x升级至5.0
查看>>
Hibernate中save、persist和saveOrUpdate这三个方法的区别
查看>>
c++去掉字符串中连续的空格,只保留一个
查看>>
按钮动画学习2
查看>>
我的友情链接
查看>>
纯靠内链提权重
查看>>