【暑假】[深入动态规划]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 思路: 引别人一 ...
随机推荐
- Mapped Statements collection does not contain value for
这是由pojo的映射文件的命名空间引起的错误. 按照以下格式即可:命名空间中一定要含有mapper.xxMapper这样的格式,否则出现以上错误. <?xml version="1.0 ...
- uva 11461
简单 打个表 case数不超过200 数据比较水 木有超时的风险~~ /*************************************************************** ...
- 【网络】IP地址分配、端口号、分层
3.网络分层 OSI的七层网络结构图和TCP/IP的五层结构图 OSI七层模型OSI中的层 功能 ...
- POJ1260Pearls
http://poj.org/problem?id=1260 题意 :这个题大概是讲,给你几种等级不同的珠宝,然后告诉你它的数量和价值,等级是升序排列的,且随等级的升高价值也随之升高,但为了防止有的客 ...
- 转--利用函数模板技术,写一个简单高效的 JSON 查询器
http://www.cnblogs.com/index-html/archive/2012/07/18/js_select.html http://www.ibm.com/developerwork ...
- Ubuntu 12.04安装字体
http://www.2cto.com/os/201210/160645.html 安装方法,终端输入: $ sudo thunar /usr/share/fonts/truetype 待ture ...
- nginx负载均衡和反向代理有什么区别
近在研究nginx的负载均衡和反向代理,先看下这两个简单的配置吧! 负载均衡 worker_processes 1; events { worker_connections 1024; } http{ ...
- WPF之小动画一
定义动画: 直接使用Element进行BeginAnimation DoubleAnimation animation = new DoubleAnimation(); animation.By = ...
- Zookeeper命令
常用命令 ZooKeeper 支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 telnet 或 nc 向 Zoo ...
- C# DateDiff与DateAdd
原文地址:http://www.wlm.so/Article/Detail/lmb49q5hxpqyi00000 刚刚在百度上搜C#里面的DateDiff,一看吓一跳,C#没有这个函数. 还有各种自定 ...