题目: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 位置的高度到底是多少。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;} const int N=;
int n,a[N],dp[N][N][];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
memset(dp,0x3f,sizeof dp);
dp[][][]=dp[][][]=dp[][][]=;
for(int i=,lm=i+>>;i<=n;i++,lm=i+>>)
for(int j=;j<=lm;j++)
{
dp[i][j][]=dp[i-][j][];
int w=; if(a[i]>=a[i-])w=a[i]-a[i-]+;
dp[i][j][]=Mn(dp[i][j][],dp[i-][j][]+w);
if(!j)continue;
dp[i][j][]=dp[i-][j-][];
if(a[i-]>=a[i])dp[i][j][]+=a[i-]-a[i]+;
w=; if(a[i-]>=a[i-])w+=a[i-]-a[i-]+;
int tp=Mn(a[i-]-,a[i-]);
if(tp>=a[i])w+=tp-a[i]+;
dp[i][j][]=Mn(dp[i][j][],dp[i-][j-][]+w);
}
/*
for(int i=1,lm=i+1>>1;i<=n;i++,lm=i+1>>1)
for(int j=0;j<=lm;j++)
{
dp[i][j][0]=dp[i-1][j][0];
h[i][j][0]=a[i];
int w;
if(a[i]>=h[i-1][j][1])w=a[i]-h[i-1][j][1]+1;
else w=0;
if(dp[i-1][j][1]+w<dp[i][j][0])
dp[i][j][0]=dp[i-1][j][1]+w,h[i][j][0]=h[i-1][j][1]-1; if(j)
{
dp[i][j][1]=dp[i-1][j-1][0];
h[i][j][1]=a[i];
if(h[i-1][j-1][0]>=a[i])
dp[i][j][1]+=h[i-1][j-1][0]-a[i]+1;
}
}
*/
for(int i=n+>>;i>=;i--)
{
dp[n][i][]=Mn(dp[n][i][],dp[n][i][]);
dp[n][i][]=Mn(dp[n][i][],dp[n][i+][]);
}
for(int i=,lm=n+>>;i<=lm;i++)
printf("%d ",dp[n][i][]);
puts(""); return ;
}

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

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;} const int N=;
int n,a[N],dp[N][N][],h[N][N][];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
memset(dp,0x3f,sizeof dp);
dp[][][]=;
for(int i=,lm=i+>>;i<=n;i++,lm=i+>>)
for(int j=;j<=lm;j++)
{
dp[i][j][]=dp[i-][j][];
h[i][j][]=a[i];
int w;
if(a[i]>=h[i-][j][])w=a[i]-h[i-][j][]+;
else w=;
if(dp[i-][j][]+w<dp[i][j][])
dp[i][j][]=dp[i-][j][]+w,
h[i][j][]=Mn(h[i][j][],h[i-][j][]-);//Mn if(j)
{
dp[i][j][]=dp[i-][j-][];
h[i][j][]=a[i];
if(h[i-][j-][]>=a[i])
dp[i][j][]+=h[i-][j-][]-a[i]+;
}
}
for(int i=n+>>;i>=;i--)
{
dp[n][i][]=Mn(dp[n][i][],dp[n][i][]);
dp[n][i][]=Mn(dp[n][i][],dp[n][i+][]);
}
for(int i=,lm=n+>>;i<=lm;i++)
printf("%d ",dp[n][i][]);
puts(""); return ;
}

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. dubbo管理控制台搭建

    1. 从网上下载dubbo管理控制台:dubbo-admin-2.5.4.war 2. 下载tomcat7,解压缩 3. 将tomcat7 webapps/ROOT的文件全部删除,然后把dubbo-a ...

  2. linux System V IPC Mechanisms

    Message Queues Semaphores Shared Memory

  3. 玩转X-CTR100 l STM32F4 l PS2无线手柄

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] SONY的PS2无线手柄是索尼游戏机的遥控手柄,控制 ...

  4. DevExpress v17.2新版亮点—.NET Reporting篇(二)

    用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了.NET Reporting v17.2 的新功能,快来下载试用新版本! 支持AS ...

  5. DevExpress v17.2新版亮点—WinForms篇(五)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.开篇介绍了DevExpress WinForms v17.2 Data Grid Control ...

  6. & | ^ ~ << >> 按位运算符

    与(&) |(或) ^(异或)  ~(取反) <<(左移) 先将两个数全部转化成为2进制再进行比较,再进行比较,位数不同则前面添0变为位数相同,然后再将得到的结果转化为你想要的类型 ...

  7. 可远程定位、解锁并启动汽车的黑客设备OwnStar

    GM告诉WIRED,OnStar用户不必担心之前存在的问题,现在已经修复了之前可被利用的漏洞,. 然而,Kamkar表示问题还是没有被解决,并且已经由GM汇报了该问题. 在任何已经连接的汽车上,GM的 ...

  8. 类似select下拉选择框同时又支持手动输入的元素 datalist 介绍。

    有时候我们会有这样的需求,通过使用下拉菜单给用户一定的选择范围,同时又可以使用户在找不到选择项的时候手动输入.这个时候我们就需要用到html5的datalist属性了. datalist包含<o ...

  9. Intellij Idea2016.3 svn服务器拉取代码

    1.修改idea的默认配置,取消SVN设置里的两个勾 2.拉取代码 3.输入SVN仓库的地址,然后checkout 即可

  10. 【论文解读】行人检测:What Can Help Pedestrian Detection?(CVPR'17)

    前言 本篇文章出自CVPR2017,四名作者为Tsinghua University,Peking University, 外加两名来自Megvii(旷视科技)的大佬. 文章中对能够帮助行人检测的ex ...