Time Limit: 1000 ms   Memory Limit: 256 MB

Description

  大家都知道,长城在自然条件下会被侵蚀,因此,我们需要修复。现在是21世纪,修复长城的事情当然就交给机器人来干辣。我们知道,长城每时每刻都在受到侵蚀,如果现在不修复,以后修复的代价会更高。现在,请你写一个程序来确定机器人修长城的顺序,使得修复长城的代价最小。

  在这道题中,我们认为长城是一条很长的线段,长城的每个位置都有唯一的数字与它对应(即当前位置到长城某一端的距离)。这台机器人开始被放在一个给定的初始位置,并以一个恒定的速率行驶。对于每个损坏的地方,你都知道它具体的位置、现在修复的代价、以后修复代价会怎么增加。由于机器人效率特别高,机器人每到损坏的地方就能瞬间将该位置修复(神秘)。

Input

  第一行三个整数 $n, v, x (1 \leq n \leq 1000, 1 \leq v \leq 100, 1 \leq x \leq 500000)$ ,分别表示长城损坏地方的数目、机器人在1个单位时间内移动的长度、机器人的初始位置。

  接下来n行,每行三个整数 $x, c, u (1 \leq x \leq 500000, 0 \leq c \leq 50000, 1 \leq u \leq 50000)$ 。x代表损坏地方的位置。如果立即修复,则该损坏位置修复的代价为c。如果选择在t时刻后修复,则该损坏位置修复的代价为c+u*t。数据保证所有损坏的位置都是不同的,机器人刚开始不会站在损坏的位置上面。

Output

  输出只有一个整数,修复整个长城的最小代价(如果是小数,则向下取整)。

  对于下面第一组样例的解释:

  首先去998位置修复,费用为600。

  然后去1010位置修复,费用为1400。

  最后去996位置修复,费用为84。

  最终答案为2084。

Sample Input  

Sample Output  

【样例输入1】
  3 1 1000
  1010 0 100 
  998 0 300
  996 0 3

【样例输入2】
  3 1 1000
  1010 0 100
  998 0 3
  996 0 3

【样例输出1】
2084

【样例输出2】
1138

  


题解:

  鉴于这是一个神级机器人,经过的地方都能瞬间修好,那么被修好的地方都一定是连续的。在修的过程中,要么向左修一下,要么向右修一下,仅有两种决策。这时想到区间DP。

  

  DP中只需要计算增长的损失即可,原损失必然加到总和之中。

  设$f_{i,j}$表示已修好$[i,j]$,此时站在$i$上;设$g_{i,j}$表示已修好$[i,j]$,此时站在$j$上。

  如果从$[i-1,j]$扩展到$[i,j]$,所用时间为$t$,相当于$[1,i]$的点和$[j+1,n]$的点都有$t$的损失。用前缀和维护$[1,i]$与$[j+1,n]$的总损失速度,乘上$t$加入代价中。

  同理,从$[i,j-1]$扩展到$[i,j]$,所用时间为$t$,相当于$[1,i-1]$与$[j,n]$的点都有$t$的损失,同样用前缀和求出,计算这一步的代价。

  

方程如下:

  前缀和数组$a_i=\sum\limits_{j=1}^i u_i$

  则 

  $$\begin{aligned}f_{i,j}&=min(f_{i+1,j}+(x_{i+1}-x_i)*(a_i+a_n-a_j),g_{i+1,j}+(x_j-x_i)*(a_i+a_n-a_j))\\g_{i,j}&=min(f_{i,j-1}+(x_{j}-x_i)*(a_{i-1}+a_n-a_{j-1}),g_{i,j-1}+(x_j-x_{j-1})*(a_{i-1}+a_n-a_{j-1}))\\\end{aligned}$$

  

Tips:

    1.为了处理方便,可以多设置一个毫发无损的修复点代表起点。

  2.dp数组要开long long:为了精度问题,计算中先不除$v$,最后输出的时候简单处理一下再除$v$。

  3.我的代码里面,$f$数组多开了一维表示是站在左边还是站在右边,而不是这里写的$f$和$g$。

  总体还是比较简单的,当时没有想到可以用前缀和方便维护全局的损失,写得奇奇怪怪只有40,无语了。


  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. typedef long long ll;
  7. typedef double db;
  8. const int N=;
  9. int n,v,X,p;
  10. ll f[N][N][],sum[N],ans;
  11. struct Node{
  12. ll x,c,u;
  13. friend bool operator < (Node x,Node y){
  14. return x.x<y.x;
  15. }
  16. }s[N];
  17. int main(){
  18. scanf("%d%d%d",&n,&v,&X);
  19. for(int i=;i<=n;i++){
  20. scanf("%d%d%d",&s[i].x,&s[i].c,&s[i].u);
  21. ans+=s[i].c;
  22. }
  23. s[++n].x=X; s[n].c=s[n].u=;
  24. sort(s+,s++n);
  25. for(int i=;i<=n;i++){
  26. if(s[i].x<=X) p=i;
  27. sum[i]=sum[i-]+s[i].u;
  28. }
  29. memset(f,0x7f,sizeof f);
  30. f[p][p][]=f[p][p][]=;
  31. ll t1,t2,out;
  32. for(int l=;l<=n;l++)
  33. for(int i=,j;i<=n-;i++){
  34. j=i+l-;
  35. if(j>n) break;
  36. t1=s[i+].x-s[i].x; t2=s[j].x-s[i].x; out=sum[i]+(sum[n]-sum[j]);
  37. f[i][j][]=min(f[i+][j][]+t1*out,f[i+][j][]+t2*out);
  38. t1=s[j].x-s[j-].x; t2=s[j].x-s[i].x; out=sum[i-]+(sum[n]-sum[j-]);
  39. f[i][j][]=min(f[i][j-][]+t2*out,f[i][j-][]+t1*out);
  40. }
  41. printf("%lld\n",(ans*v+(min(f[][n][],f[][n][])))/v);
  42. return ;
  43. }

奇妙代码

修长城 (区间DP)的更多相关文章

  1. 【noip模拟】修长城

    Time Limit: 1000ms    Memory Limit: 256MB Description 大家都知道,长城在自然条件下会被侵蚀,因此,我们需要修复.现在是21世纪,修复长城的事情当然 ...

  2. P4677 山区建小学|区间dp

    P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区 ...

  3. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  4. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  5. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  6. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  7. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

  8. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  9. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

随机推荐

  1. RequestParam\@ResponseBody

    为什么不写 RequestParam 也能拿到参数 三种写法,test(String name), test(@RequestParam String name), test(@RequestPara ...

  2. Windows ftp脚本和RSCD agent自动安装脚本

    Windows ftp脚本 和bladelogic RSCD Agent自动安装脚本 比较简单的命令是msiexec /I "C:\RSCD85-SP1-WIN64.msi" /Q ...

  3. Windows任务计划程序起始于参数自动修改

    Windows任务计划程序建立后,手工运行可以成功,但计划任务自动运行却不能成功,搜索网络,原来是起始于参数没有配置,这个参数的英文名字是start-in.它保证任务计划程序的WorkingDirec ...

  4. 【转】新手该如何学python怎么学好python?

    1)学好python的第一步,就是马上到www.python.org网站上下载一个python版本.我建议初学者,不要下载具有IDE功能的集成开发环境,比如Eclipse插件等. 2) 下载完毕后,就 ...

  5. 系统uid在1-499的原因

    1.因为是保留给系统使用的UID,为了与用户设置的账户区分,防止冲突. 2.并没有其他特别的意义, 3.也叫作虚拟用户,除了0之外,所有的UID在使用上并没有任何区别. 4.linux中文件和程序都要 ...

  6. Cookie简述

    1. Cookie是什么? Cookie(Cookies,浏览器缓存), 是指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 2. Cookie的作用: ...

  7. dl在不同浏览器下显示不同

    dl在chrome浏览器和在火狐浏览器下的默认样式是不一样的,解决方法将dl换成ol或ul样式就正常了.

  8. chromedriver禁用图片,禁用js,切换UA

    selenium 模拟chrome浏览器,此时就是一个真实的浏览器,一个浏览器该加载的该渲染的它都加载都渲染,所以爬取网页的速度很慢.如果可以不加载图片等操作,网页加载速度就会快不少,代码中列出了了禁 ...

  9. CentOS上安装MongoDB速记

    测试环境版本CentOS 6.5 先创建安装目标文件夹并进入至该文件夹: mkdir /opt/mongodb cd /opt/mongodb 给mongodb创建用户及用户组: groupadd m ...

  10. Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin

    来源博客:Wang Jie's Blog 本文链接:<http://blog.wangjiegulu.com/2018/02/05/Android端生成META-INF信息文件的Gradle插件 ...