uva12563
2016-04-09 00:32
330 查看
可以说是第一题DP,
也不是这样说,就是理解的第一题,虽然还是似懂非懂
但套路有一点:初始化,然后状态的转化就是递推赋值,然后和新的状态比较一下。OK了
题意必须先明确保证唱的歌曲数目最多,然后再开一个数组去记录伴随的唱歌时间使之最长。OK
UVA 12563
也不是这样说,就是理解的第一题,虽然还是似懂非懂
但套路有一点:初始化,然后状态的转化就是递推赋值,然后和新的状态比较一下。OK了
题意必须先明确保证唱的歌曲数目最多,然后再开一个数组去记录伴随的唱歌时间使之最长。OK
UVA 12563
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<math.h> #include<queue> #include<stack> #include<algorithm> using namespace std; // 得先保证歌曲的数目最大,然后再去搞定时间,时间只要再开一个数组就搞定了 // 也没必要逆着来 int path[55][10005]; int dp[55][10005]; //前i个在第j秒最多能唱的歌曲数目; int n,t; int val[55]; void debug() { for(int i=1;i<=n;i++) { printf("%d ",dp[i][t-1]); } printf("\n"); } int main() { int T; int qq=1; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&t); for(int i=1;i<=n;i++) { scanf("%d",&val[i]); } memset(path,0,sizeof(path)); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=0;j<=t-1;j++) { dp[i][j]=dp[i-1][j]; path[i][j]=path[i-1][j]; if(j>=val[i]) { if(dp[i][j]<dp[i-1][j-val[i]]+1) { dp[i][j]=dp[i-1][j-val[i]]+1; path[i][j]=path[i-1][j-val[i]]+val[i]; } else if(dp[i][j]==dp[i-1][j-val[i]]+1) { path[i][j]=max(path[i][j],path[i-1][j-val[i]]+val[i]); } } } } int max_=-1; for(int i=1;i<=n;i++) { if(max_<dp [t-1]) { max_=dp [t-1]; } } // debug(); printf("Case %d: %d %d\n",qq++,max_+1,path [t-1]+678); } return 0; } /* 3 100 60 70 80 3 100 30 69 70 3 12 11 1 1 */
相关文章推荐
- 10016---SolrFacetSearch - Changes from 5.6 to 5.7
- sql server 2008 相关基础(物理备份还原)
- html table表头不变滚动表体
- 二叉树
- 设计模式学习笔记之UML符号的简单总结
- 最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)
- iOS笔记2 Scrollview
- 孔子的学费
- 在努力的途中 忤逆满路荆棘
- 测试工具类
- Qml 写的弹出层控件(13篇博客)
- uva 167 The Sultan's Successors
- webstorm快捷键
- ios笔记
- Comparator与Comparable
- wordpress 自定义面板显示不了挂件区问题
- hdoj1028;他们说这题叫dp...
- RecylerView在Fragment中卡顿
- 去哪儿笔试题 首个重复字符
- 案例6数据加密程序