题目:http://codeforces.com/contest/1013/problem/E

设 dp[ i ][ j ][ 0/1 ] 表示前 i 个位置,有 j 个山峰,第 i 个位置不是/是山峰的最小代价。

dp[ i ][ j ][ 0 ] 可以从 dp[ i-1 ][ j ][ 0/1 ] 转移,从 1 转移的话要调整成 a[ i ] <= a[ i-1 ] ,因为  i-1 是山峰,所以它的高度一定还是原高度 a[ i-1 ],从 0 转移没有要求。

dp[ i ][ j ][ 1 ] 需要从 dp[ i-2 ][ j-1 ][ 0/1 ] 转移,这样才能知道  i-2 位置的高度到底是多少。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. int Mx(int a,int b){return a>b?a:b;}
  7. int Mn(int a,int b){return a<b?a:b;}
  8.  
  9. const int N=;
  10. int n,a[N],dp[N][N][];
  11. int main()
  12. {
  13. scanf("%d",&n);
  14. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  15. memset(dp,0x3f,sizeof dp);
  16. dp[][][]=dp[][][]=dp[][][]=;
  17. for(int i=,lm=i+>>;i<=n;i++,lm=i+>>)
  18. for(int j=;j<=lm;j++)
  19. {
  20. dp[i][j][]=dp[i-][j][];
  21. int w=; if(a[i]>=a[i-])w=a[i]-a[i-]+;
  22. dp[i][j][]=Mn(dp[i][j][],dp[i-][j][]+w);
  23. if(!j)continue;
  24. dp[i][j][]=dp[i-][j-][];
  25. if(a[i-]>=a[i])dp[i][j][]+=a[i-]-a[i]+;
  26. w=; if(a[i-]>=a[i-])w+=a[i-]-a[i-]+;
  27. int tp=Mn(a[i-]-,a[i-]);
  28. if(tp>=a[i])w+=tp-a[i]+;
  29. dp[i][j][]=Mn(dp[i][j][],dp[i-][j-][]+w);
  30. }
  31. /*
  32. for(int i=1,lm=i+1>>1;i<=n;i++,lm=i+1>>1)
  33. for(int j=0;j<=lm;j++)
  34. {
  35. dp[i][j][0]=dp[i-1][j][0];
  36. h[i][j][0]=a[i];
  37. int w;
  38. if(a[i]>=h[i-1][j][1])w=a[i]-h[i-1][j][1]+1;
  39. else w=0;
  40. if(dp[i-1][j][1]+w<dp[i][j][0])
  41. dp[i][j][0]=dp[i-1][j][1]+w,h[i][j][0]=h[i-1][j][1]-1;
  42.  
  43. if(j)
  44. {
  45. dp[i][j][1]=dp[i-1][j-1][0];
  46. h[i][j][1]=a[i];
  47. if(h[i-1][j-1][0]>=a[i])
  48. dp[i][j][1]+=h[i-1][j-1][0]-a[i]+1;
  49. }
  50. }
  51. */
  52. for(int i=n+>>;i>=;i--)
  53. {
  54. dp[n][i][]=Mn(dp[n][i][],dp[n][i][]);
  55. dp[n][i][]=Mn(dp[n][i][],dp[n][i+][]);
  56. }
  57. for(int i=,lm=n+>>;i<=lm;i++)
  58. printf("%d ",dp[n][i][]);
  59. puts(""); return ;
  60. }

自己原来还写了一个不是从 i-2 转移的,但带了一个 h[ i ][ j ][ 0/1 ] 表示当前的高度。这个 h[ ][ ][ ] 不参与转移,所以只是记录一下,不增加复杂度。但不知为何不对。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. int Mx(int a,int b){return a>b?a:b;}
  7. int Mn(int a,int b){return a<b?a:b;}
  8.  
  9. const int N=;
  10. int n,a[N],dp[N][N][],h[N][N][];
  11. int main()
  12. {
  13. scanf("%d",&n);
  14. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  15. memset(dp,0x3f,sizeof dp);
  16. dp[][][]=;
  17. for(int i=,lm=i+>>;i<=n;i++,lm=i+>>)
  18. for(int j=;j<=lm;j++)
  19. {
  20. dp[i][j][]=dp[i-][j][];
  21. h[i][j][]=a[i];
  22. int w;
  23. if(a[i]>=h[i-][j][])w=a[i]-h[i-][j][]+;
  24. else w=;
  25. if(dp[i-][j][]+w<dp[i][j][])
  26. dp[i][j][]=dp[i-][j][]+w,
  27. h[i][j][]=Mn(h[i][j][],h[i-][j][]-);//Mn
  28.  
  29. if(j)
  30. {
  31. dp[i][j][]=dp[i-][j-][];
  32. h[i][j][]=a[i];
  33. if(h[i-][j-][]>=a[i])
  34. dp[i][j][]+=h[i-][j-][]-a[i]+;
  35. }
  36. }
  37. for(int i=n+>>;i>=;i--)
  38. {
  39. dp[n][i][]=Mn(dp[n][i][],dp[n][i][]);
  40. dp[n][i][]=Mn(dp[n][i][],dp[n][i+][]);
  41. }
  42. for(int i=,lm=n+>>;i<=lm;i++)
  43. printf("%d ",dp[n][i][]);
  44. puts(""); return ;
  45. }

CF 1013E Hills——隔项转移的DP的更多相关文章

  1. CF 1013E Hills

    这是一道DP题...我居然有那么半个小时思考非DP解决方案,实在是太弱了. 题意:给您若干山,您可以花费1代价削去1高度,求有k个山峰时的最小代价. 输出k = 1 ~ (n + 1) >> ...

  2. cf 853 D Michael and Charging Stations [dp]

    题面: 传送门 思路: 看到题目,第一思路是贪心,但是我很快就否决掉了(其实分类贪心也可以做) 然后就想,贪心不能解决的状态缺失,是否可以用dp来解决呢? 事实证明是可以的 我们设dp[i][j]表示 ...

  3. 【Codeforces】CF 467 C George and Job(dp)

    题目 传送门:QWQ 分析 dp基础题. $ dp[i][j] $表示前i个数分成j组的最大和. 转移显然. 吐槽:做cf题全靠洛谷翻译苟活. 代码 #include <bits/stdc++. ...

  4. (中等) CF 311B Cats Transport,斜率优化DP。

    Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...

  5. [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)

    题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...

  6. CF 633 F. The Chocolate Spree 树形dp

    题目链接 CF 633 F. The Chocolate Spree 题解 维护子数答案 子数直径 子数最远点 单子数最长直径 (最长的 最远点+一条链) 讨论转移 代码 #include<ve ...

  7. 【Codeforces】CF 9 D How many trees?(dp)

    题目 传送门:QWQ 分析 用$ dp[i][j] $表示用i个节点,有多少深度小于等于j的二叉树. 答案是$ dp[n][n] - dp[n][h-1] $ 转移时枚举左子树的节点数量,就可以知道右 ...

  8. CF 148D Bag of mice【概率DP】

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes Promblem descriptio ...

  9. CF - 1107 E Vasya and Binary String DP

    题目传送门 题解: dp[ l ][ r ][ k ] 代表的是[l, r]这段区间内, 前面有k-1个连续的和s[l]相同且连续的字符传进来的最大值. solve( l, r, k) 代表的是处理 ...

随机推荐

  1. 第一个 MVC 应用程序(下半部分)

    2.4 创建一个简单的数据录入应用程序 本章的其余部分将通过一个简单的数据录入应用程序来考查 MVC 的更多基本特性.本小节打算分步进行,目的是演示 MVC 的运用. B1.设计一个数据模型 在 MV ...

  2. Nginx 关于 location 的匹配规则详解

    有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...

  3. elment-ui table组件 -- 远程筛选排序

    elment-ui table组件 -- 远程筛选排序 基于 elment-ui table组件 开发,主要请求后台实现筛选 排序的功能. 需求 排序 筛选 是对后台整个数据进行操作,而不是对当前页面 ...

  4. JavaScript学习总结(十九)——使用js加载器动态加载外部Javascript文件

    今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js 1 var MiniSite=new Object(); 2 /** 3 * 判断浏览器 4 */ 5 M ...

  5. learning uboot fstype command

    => fstypefstype - Look up a filesystem type Usage:fstype <interface> <dev>:<part&g ...

  6. HDU 4791 Alice's Print Service 思路,dp 难度:2

    A - Alice's Print Service Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  7. python执行系统命令后获取返回值

    import os, subprocess # os.system('dir') #执行系统命令,没有获取返回值,windows下中文乱码 # result = os.popen('dir') #执行 ...

  8. python爬虫常见面试题(二)

    前言 之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆:二是给自己一个和大家交流的机会,互相学习.进步,希望不正之处大家能给予指正:三是我也是互联网寒潮下岗的那批人之一,为 ...

  9. Linux:查看进程运行时间

    查看进程运行时间 应用ps命令,加选项-Ao,加参数,最后过滤. ps -Ao pid,tty,user,stime,etime,comm,args| grep firefox pid:进程ID tt ...

  10. Bootstrap CustomBox 弹层

    这个模态窗口插件使用原生javascript制作,它也可以和jQuery完美的结合.请注意:这些模态窗口动画仅仅工作在支持各自CSS3属性的浏览器上.Internet Explorer 8 和 9需要 ...