杭电 2059 龟兔赛跑
2015-10-31 17:59
267 查看
简单dp
题解:http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=13573&messageid=1&deep=0
以充电的地方做为dp的地方,将起点,终点充当做充电站,则下表分别为a[0],a[n+1];
dp[i]表示从起点到达实际第i个充电站的最小消耗时间;
内层让j从0遍历到i-1,每一个j表示最后一次充电到i点
那么状态转移方程为
DP[i] = min(DP[j] + t(j, i)) //t(j, i)表示从j充完电一直到i点(中途没有充过电)
代码如下:
题解:http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=13573&messageid=1&deep=0
以充电的地方做为dp的地方,将起点,终点充当做充电站,则下表分别为a[0],a[n+1];
dp[i]表示从起点到达实际第i个充电站的最小消耗时间;
内层让j从0遍历到i-1,每一个j表示最后一次充电到i点
那么状态转移方程为
DP[i] = min(DP[j] + t(j, i)) //t(j, i)表示从j充完电一直到i点(中途没有充过电)
代码如下:
#include<stdio.h> #include<algorithm> #define INF 1000000000 using namespace std; double l; double dp[10000], a[10000]; void test() { int n; double c,t,vr,vt1,vt2; scanf("%d%lf%lf",&n,&c,&t); scanf("%lf%lf%lf",&vr,&vt1,&vt2); a[0] = 0; for(int i=1; i<=n; i++) scanf("%lf", &a[i]); a[n+1] = l; for(int i=1; i<= n+1; i++) { dp[i] = INF; for(int j=0; j<i; j++) { double time = 0; double len = a[i] - a[j]; if(len > c) time += (len-c)/vt2 + 1.0*c/vt1; else time += len/vt1; if(j) time += t; time += dp[j]; dp[i] = min(dp[i],time); } } if(dp[n+1] > 1.0*l/vr) printf("Good job,rabbit!\n"); else printf("What a pity rabbit!\n"); } int main() { while(scanf("%lf",&l)!=EOF) test(); return 0; }
相关文章推荐
- ubuntu 创建快捷方式
- 拓扑结构相同子树练习题
- IPV6表示
- 杭电 5506 GT and set
- 给label加中划线
- Java EE (10) - 资源服务器的整合
- JavaMail简单版实验测试
- Xcode中自己创建prefix文件流程
- 杭电1180 诡异的楼梯
- 黑马程序员------String类
- 面向对象的特征
- hdu 5221 Meeting 建图+迪杰斯特拉
- read/fread write/fwrite 的区别
- Codeforces 400 C. Inna and Huge Candy Matrix【 Codeforces Round #234 (Div. 2)】
- Hadoop中的Hive与Hbase的理解
- PySqlite 学习笔记
- Maya mental ray 焦散
- 【从源码看Android】02MessageQueue的epoll原型
- 【LEETCODE】100-Same Tree
- HDU 1698 线段树区间更新以及lazy思想