【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall
UVa 10618 Fixing the Great Wall
题目:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36139
思路:
数轴上有n个点需要修复,每个点有信息c,x,d 表示位于x且在t时修缮的费用是c+d*t,找一个修缮序列使n个点能全部修缮且有费用最小。
可以发现:在任意时刻,修缮完的点都是连续的,因为修缮不需要时间,将一些点“顺手”修缮了肯定不差。
d[i][j][k],表示已经将i-j个点修缮完后位于p(if (k==0) p=i;else p=j;)的花费,不知道时间怎么办呢?
:注意到每个点的花费是c+d*t ,累计花费并不一定要将每个点的花费都求出来然后相加。于是正式定义d表示该清情况下所有已知花费,每当因为移动时间耗去t所有没有访问的点u花费都会相应增加u.d*t,总花费增加sum_d*t。换句话说,这种方法根据花费的特点将单个点花费累加变成了累计未访问点在未访问时间内的花费。
当位于ijk时有两种抉择:左走i-1 j 0 或右走 i j+1 1 这就是子问题 。
答案不大于10^9 但过程中好像input中会出现超int的情况但long long空间占用太大,因此用了double,最后转成int。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; const int maxn = + ;
const int INF = 1e30; struct Node{
double x,c,d;
bool operator <(const Node& rhs) const {
return x<rhs.x; }
};
Node nodes[maxn]; int n,kase;
double v,x,d[maxn][maxn][];
//d记录目前已知的所有花费
double pre_d[maxn];
int vis[maxn][maxn][]; inline double cost(double x,double y,int i,int j) {
double finished=;
if(i>j) return 0.0;
if(i>= && j>=) finished += pre_d[j]-pre_d[i-]; //sum_d[i,j]
return (pre_d[n]-finished) * fabs(y-x)/v; //总花费+所有未访问的点.d*t
} double dp(int i,int j,int k) {
if(i== && j==n) return ; // 边界
double& ans=d[i][j][k];
if(vis[i][j][k]==kase) return ans;
vis[i][j][k]=kase; //记忆化搜索 ans=INF;
double x=(k==? nodes[i].x:nodes[j].x);
if(i>) ans=min(ans,dp(i-,j,) + cost(x,nodes[i-].x,i,j));
if(j<n) ans=min(ans,dp(i,j+,) + cost(x,nodes[j+].x,i,j));
return ans;
} int main() {
kase=;
memset(vis,,sizeof(vis));
while(scanf("%d%lf%lf",&n,&v,&x)== && (n&&v&&x)) {
++kase;
double sumc=;
FOR(i,,n+){
scanf("%lf%lf%lf",&nodes[i].x,&nodes[i].c,&nodes[i].d);
sumc += nodes[i].c;
}
sort(nodes+,nodes+n+); pre_d[]=;
FOR(i,,n+) pre_d[i]=pre_d[i-]+nodes[i].d; //'哨兵' 如果初始点在第0个点的左或第n个点的右 //使满足判断的普遍性
nodes[].x=-INF;
nodes[n+].x=INF;
double ans= INF;
FOR(i,,n+)
if(x>nodes[i-].x && x<nodes[i].x){ //找到起点位置处于i-1...i 然后移动向左|右点
if(i>) ans=min(ans,dp(i-,i-,)+cost(x,nodes[i-].x,-,-));
if(i<=n) ans=min(ans,dp(i,i,)+cost(x,nodes[i].x,-,-));
break;
}
printf("%0.lf\n",floor(ans + sumc));
}
return ;
}
【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall的更多相关文章
- 【暑假】[深入动态规划]UVa 10618 Fun Game
UVa 10618 Fun Game 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36035 思路: 一圈人围坐 ...
- 【暑假】[深入动态规划]UVa 10618 Tango Tango Insurrection
UVa 10618 Tango Tango Insurrection 题目: Problem A: Tango Tango Insurrection You are attempting to lea ...
- 【暑假】[深入动态规划]UVa 10618 The Bookcase
UVa 12099 The Bookcase 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=42067 思路: ...
- UVa 1336 Fixing the Great Wall (区间DP)
题意:给定 n 个结点,表示要修复的点,然后机器人每秒以 v 的速度移动,初始位置在 x,然后修复结点时不花费时间,但是如果有的结点暂时没修复, 那么每秒它的费用都会增加 d,修复要花费 c,坐标是 ...
- UVA-1336 Fixing the Great Wall(区间DP)
题目大意:长城(视作x正半轴)有n处破损.有一个智能修复机器人,它的初始位置和移动速度已知.每处破损处都有一组参数(x,c,d),x表示位置,c.d表示在时间t后再修复该处破损的花费为d*t+c.求用 ...
- 【杂题总汇】UVa-1336 Fixing the Great Wall
[UVA-1336]Fixing the Great Wall 一开始把题看错了……直接用的整数存储答案:之后用double存最后输出答案的时候取整就AC了
- 【暑假】[深入动态规划]UVa 1628 Pizza Delivery
UVa 1628 Pizza Delivery 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51189 思路: ...
- 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem
UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...
- 【暑假】[深入动态规划]UVa 12170 Easy Climb
UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路: 引别人一 ...
随机推荐
- 如何将word中上下两行文字对齐?
一.问题来源及描述 本科毕设的时候积累的问题,整理如下. 红头文件下面的署名,上下要对齐. 二.解决办法 经验证,第一次拉标尺要把标尺放在第一行的光标处,为了换行后,再次enter,tab后到与上一行 ...
- PAT-乙级-1002. 写出这个数 (20)
1002. 写出这个数 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 读入一个自然数n,计算其各位数字 ...
- spoj 247
不管行列 总是先切割切割费用大的 代码比较烂 ...... #include <iostream> #include <cstdio> #include <cstr ...
- Unity3D的几种坐标系
原地址:http://www.cnblogs.com/martianzone/p/3371789.html http://www.cnblogs.com/88999660/archive/2013/0 ...
- redis 参考
http://redis.readthedocs.org/en/2.4/index.html
- redisb并发访问慢出现的问题
最近项目一上线,就问题颇多,本地测试,ok,上线后,大用户量的时候,顶不住.用了一个礼拜的时间发现的问题,总结下来. 项目是netty4.0,reids2.8,nginx等框架.目前是4台proxy服 ...
- WCF之各种WCF引用方式
写在开头:本文内容来自 WCF全面解析中的一个经典例子,如果你已经看过了,那么可以忽略本文,本文旨在和大家分享不一样的WCF使用方法. 准备工作: 1.创建解决方案WCFService(当然名字可以任 ...
- mysql的group by应用
CREATE TABLE group_test ( id TINYINT(1) UNSIGNED NOT NULL, pubid TINYINT(1) UNSIGNED NOT NULL, user ...
- Vim常用命令手册
这两年工作基本都是用vim,用习惯发现到哪都离不开这玩意. 退出编辑器 :w 将缓冲区写入文件,即保存修改:wq 保存修改并退出:x 保存修改并退出:q 退出,如果对缓冲区进行过修改,则会提示:q! ...
- python中的commands模块
commands模块用于调用shell命令 有3中方法: commands.getstatus() 返回执行状态 commands.getoutput() 返回执行结果 commands.ge ...