ZOJ 2972 Hurdles of 110m(DP)
2016-02-19 17:39
459 查看
题目链接:重点内容http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972
跨栏跑分为几段,每段有三种跑步方式,不同方式通过每段路程时间不同,并消耗或补充体力,要求输出最短时间。
二维DP
跨栏跑分为几段,每段有三种跑步方式,不同方式通过每段路程时间不同,并消耗或补充体力,要求输出最短时间。
二维DP
#include<iostream> #include<cstdio> #include<set> #include<string> #include<string.h> #include<cstring> #include<vector> #include<map> #include<queue> #include<stack> #include<cctype> #include<algorithm> #define mt(a) memset(a,0,sizeof a) #define fl(a,b,c) fill(a,b,c) #define inf 1000000000+7 using namespace std; typedef long long ll; int ans[200]; int dp[200][500]; int main() { int T; cin >> T; while (T--) { int n, m; scanf("%d %d", &n, &m); for (int i = 1; i < 200; i++) memset(dp[i], inf, sizeof (dp[i])); memset(dp[0], 0, sizeof(dp[0])); for (int i = 1; i <= n; i++) { int t1, t2, t3, f1, f2; scanf("%d %d %d %d %d", &t1, &t2, &t3, &f1, &f2); for (int j = 0; j <= m; j++) { if (j >= f1&&dp[i - 1][j] != inf)dp[i][j-f1] = min(dp[i][j-f1], dp[i-1][j] + t1); dp[i][j] = min(dp[i][j], dp[i - 1][j] + t2); if (j + f2 >= m)dp[i][m] = min(dp[i][m], dp[i - 1][j] + t3); else dp[i][j + f2] = min(dp[i][j + f2], dp[i - 1][j] + t3); } } int ans = inf; for (int i = 0; i <= m; i++) { ans = min(ans, dp [i]); } printf("%d\n", ans); } return 0; }
相关文章推荐
- JUnit 单元测试几个方法的用法注解
- java方法,构造方法
- 冒泡排序的理解
- AspectJ基础学习之二搭建环境(转载)
- Git Push 避免用户名和密码方法
- cocos2d-js关于对话框Layer的屏幕适配
- MySQL知识(四)——运算符
- 线程池
- 我有一个 APP 创意,如何将其实现?
- .net uploadify 传递参数 多文件上传
- JSPatch-动态更新IOS APP
- PICT使用教程(设计测试用例工具)
- AspectJ基础学习之一简介(转载)
- IDEA报错Target level '1.6' is incompatible with source level '1.7'
- 初识js中的闭包
- 设计模式之备忘录模式
- Web之一 JS
- 15.Transition动画效果私有API说明
- 4-9 统计个位数字
- Python基础学习笔记(二)语法简介