习题9-8 Uva1632
2015-11-17 11:03
232 查看
题意:
给你n个宝藏,然后给出他们的位置a[i]以及存在时间tim[i],如果能全部拿完,求出最短时间;
否则输出No solution
思路:
对于一段区间[i,j],你取完之后肯定是在最左端或者最右端,因为如果最后你停在中间位置,你始终会先到左右,所以并不能是最优解。
所以我们dp[i][j][0]表示拿完[i,j]后停在左端,dp[i][j][1]表示拿完[i,j]后停在右端
然后利用公式从小区间往大区间递推即可
Orz:
最开始递推方程不简洁,初始化数组时花费了很多时间,TL;而完全可以不初始化的
判断条件写成>tim[i],然而在tim[i]时宝藏已经消失了,所以应该是 >=
给你n个宝藏,然后给出他们的位置a[i]以及存在时间tim[i],如果能全部拿完,求出最短时间;
否则输出No solution
思路:
对于一段区间[i,j],你取完之后肯定是在最左端或者最右端,因为如果最后你停在中间位置,你始终会先到左右,所以并不能是最优解。
所以我们dp[i][j][0]表示拿完[i,j]后停在左端,dp[i][j][1]表示拿完[i,j]后停在右端
然后利用公式从小区间往大区间递推即可
Orz:
最开始递推方程不简洁,初始化数组时花费了很多时间,TL;而完全可以不初始化的
判断条件写成>tim[i],然而在tim[i]时宝藏已经消失了,所以应该是 >=
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include <vector> #include <algorithm> #include <functional> using namespace std; const int maxn = 10005; const int INF = 0x3f3f3f3f; int a[maxn]; int dp[maxn][maxn][2]; int tim[maxn]; int main() { int n; while(scanf("%d",&n) != EOF) { for(int i = 1; i <= n; i++) { scanf("%d%d",a+i,tim+i); } for(int l = 1; l <= n; l++) { for(int i = 1; i+l <= n; i++) { int j = i + l; dp[i][j][0] = min(dp[i+1][j][0] + a[i+1]-a[i],dp[i+1][j][1] + a[j] - a[i]); if(dp[i][j][0] >= tim[i]) dp[i][j][0] = INF; dp[i][j][1] = min(dp[i][j-1][1] + a[j] - a[j-1],dp[i][j-1][0] + a[j] - a[i]); if(dp[i][j][1] >= tim[j]) dp[i][j][1] = INF; } } int ans = min(dp[1] [0],dp[1] [1]); if(ans != INF) printf("%d\n",ans); else printf("No solution\n"); } return 0; }
相关文章推荐
- oracle In和exists对比
- find查找文件和目录
- Get请求和Post请求的区别
- swift 快速奔跑的兔几 本节的内容是:照片库 第二说
- php mysqli查错
- orcad16.6 与 PADS9.5 布线同步
- ExtJs教程 3.0
- Android下拉刷新开源控件 liaohuqiu/android-Ultra-Pull-To-Refresh
- mysql调优小记
- 哪种水果效果堪比伟哥
- PHP检测终端设备是平板、手机还是电脑
- java项目案例 java项目源码 java后台框架源码 企业级 SpringMVC mybatis or hibernate
- 关于Android Studio中如何解决Scode校验失败的解决方法
- jqgrid 右键菜单实现
- iOS本地通知和远程通知
- VE接口-获取经纬度
- lattice软核之:ROM的使用
- 使用Chipscope时如何防止reg_wire型信号被优化掉
- 让网页变成灰色代码
- 计算机网络——数据链路层、网络层