题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829

题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草补给的公式是将每个站能收到的粮草的总和。

4----5-----1-----2

粮草总和为4*5 + 4*1 + 4*2 + 5*1 + 5*2 + 1*2 = 49.

4----5       1-----2

粮草总和为4*5 + 1*2 = 22.

4      5-----1------2

粮草总和为5*1 + 5*2 + 1*2 = 17.

解题思路:数组dp[i][j]表示第i个位置炸成j段的最小价值,cost[i][j]表示i~j这段的价值,则得到状态转移方程:

     dp[i][j]=min{dp[k][j-1]+cost[k+1][i]}.(k<i),复杂度为O(n^3)显然会超时

     易得cost[1][i]=cost[1][k]+cost[k+1][i]+sum[k]*(sum[i]-sum[k])

     则cost[k+1][i]=cost[1][i]-cost[1][k]+sum[k]^2-sum[k]*sum[i].

     使用cost[i]表示cost[1][i]得,dp[i][j]=min{dp[k][j-1]+cost[i]-cost[k]+sum[k]^2-sum[k]*sum[i]}.   

     可以得出 y=dp[k][j-1]-cost[1][k]+sum[k]^2

     x=sum[k].

     斜率sum[i]。

     用斜率优化,将复杂度降为O(n^2)即可。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=1e3+;
  6. int dp[N][N],sum[N],cost[N],q[N],head,tail;
  7.  
  8. //yj-yk/xj-xk
  9. double Slope(int m,int k,int j){
  10. return double(dp[j][m-]+sum[j]*sum[j]-cost[j]-dp[k][m-]-sum[k]*sum[k]+cost[k])/(sum[j]-sum[k]);
  11. }
  12.  
  13. //dp[i][j]=min{dp[k][j-1]+cost[i]-cost[k]-sum[k]*(sum[i]-sum[k])}
  14. int getDP(int i,int j,int k){
  15. return dp[k][j-]+cost[i]-cost[k]-sum[k]*(sum[i]-sum[k]);
  16. }
  17.  
  18. int main(){
  19. int n,m;
  20. while(~scanf("%d%d",&n,&m)){
  21. if(m==&&n==)
  22. break;
  23. memset(cost,,sizeof(cost));
  24. sum[]=;
  25. for(int i=;i<=n;i++){
  26. scanf("%d",&sum[i]);
  27. sum[i]+=sum[i-];
  28. }
  29. for(int i=;i<=n;i++){
  30. for(int j=;j<i;j++){
  31. cost[i]+=(sum[j]-sum[j-])*(sum[i]-sum[j]);
  32. }
  33. dp[i][]=cost[i];
  34. }
  35. for(int j=;j<=m+;j++){
  36. head=tail=;
  37. q[tail++]=j-;
  38. for(int i=j;i<=n;i++){
  39. while(head+<tail&&Slope(j,q[head],q[head+])<=sum[i]){
  40. head++;
  41. }
  42. dp[i][j]=getDP(i,j,q[head]);
  43. while(head+<tail&&Slope(j,q[tail-],q[tail-])>=Slope(j,q[tail-],i)){
  44. tail--;
  45. }
  46. q[tail++]=i;
  47. }
  48. }
  49. printf("%d\n",dp[n][m+]);
  50. }
  51. return ;
  52. }

     

HDU 2829 Lawrence(斜率优化DP O(n^2))的更多相关文章

  1. hdu 2829 Lawrence(斜率优化DP)

    题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...

  2. HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

    题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...

  3. HDU 2829 Lawrence(四边形优化DP O(n^2))

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829 题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草 ...

  4. HDU2829 Lawrence —— 斜率优化DP

    题目链接:https://vjudge.net/problem/HDU-2829 Lawrence Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  5. HDU2829 Lawrence(斜率优化dp)

    学了模板题之后上网搜下斜率优化dp的题目,然后就看到这道题,知道是斜率dp之后有思路就可以自己做不出来,要是不事先知道的话那就说不定了. 题意:给你n个数,一开始n个数相邻的数之间是被东西连着的,对于 ...

  6. HDU 2829 - Lawrence - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829 T. E. Lawrence was a controversial figure during ...

  7. hdu 3480 Division(斜率优化DP)

    题目链接:hdu 3480 Division 题意: 给你一个有n个数的集合S,现在让你选出m个子集合,使这m个子集合并起来为S,并且每个集合的(max-min)2 之和要最小. 题解: 运用贪心的思 ...

  8. HDU 6619 Horse 斜率优化dp

    http://acm.hdu.edu.cn/showproblem.php?pid=6619 #include<bits/stdc++.h> #define fi first #defin ...

  9. Print Article hdu 3507 一道斜率优化DP 表示是基础题,但对我来说很难

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  10. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

随机推荐

  1. Codeforces VK Cup Finals #424 Div.1 A. Office Keys(DP)

    显然是不可能交叉取钥匙的,于是把钥匙和人都按坐标排序就可以DP了 钥匙可以不被取,于是f[i][j]表示前i个钥匙被j个人拿的时间 f[i][j]=min(f[i-1][j],max(f[i-1][j ...

  2. ContestHunter暑假欢乐赛 SRM 02

    惨不忍睹 3个小时都干了些什么... 日常按顺序从A题开始(难度居然又不是递增的 第一眼A题就觉得很简单...写到一半才发现woc那是个环.感觉一下子复杂了,按照链的方法扩展的话要特判很多东西... ...

  3. 【链表】【UVA11988】Broken Keyboard

    传送门 明明是道黄题我竟然来写博客……我真的是什么数据结构也不会写了 Description 你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下.你却不知道此问题,而是专心致志地 ...

  4. DPM(Deformable Parts Model)--原理(一)

    http://blog.csdn.net/ttransposition/article/details/12966521 DPM(Deformable Parts Model) Reference: ...

  5. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  6. JS this的指向

    总结:this指向调用函数的那个对象. 在不同的应用场景this的指向有所不同,但细细思考都符合总结的意思. 场景一:一般的函数调用 这种常见的函数调用方式this指向的是window,因为相当于是w ...

  7. 不可不知的robots.txt文件

    robots.txt基本介绍 robots.txt是一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被robots访问的部分,或者指定搜索引擎只收录指定的内容. 当一个搜索机器人(有的叫搜索 ...

  8. zoj 1729 Hidden Password

    Hidden Passwordhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=729 Time Limit: 2 Seconds ...

  9. ZOJ3874 Permutation Graph

    Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward has a permutation {a1, a2, … an}. He finds ...

  10. 【NOIP】2013 花匠

    [算法]贪心 [题解] DP可以f[i][0],f[i][1]表示选了i分别满足条件AB的答案,其优化也是利用了下面的性质,不多赘述. 想象数列的波动,最大值一定是取每个波峰和每个波谷,那么只要O(n ...