题目大意:

  有几座山,如果一座山左右两边的山比它矮,那么可以在这个山上建房子,你有一台挖掘机,每天可以挖一座山一米,问你需要花多少代价可以分别盖1、2、3……座房子。(给出山的数量,以及每座山的高度)。

题目分析:

  性质1:不会有两座相邻的山都建房子。性质 2:一座山盖房子就不会被挖,被挖就不会盖房子(两条废话)

  每一座山有两种情况:建房子或者不建,可以用一维来保存([ 0 ]/[ 1 ])。

  1到第 i 座山的代价和只与 i 前面的两座山有关:如果这座山( i )不建,那么他前面那座山( i-1 )可建可不建,它的代价就是前面山代价的最小值。如果这座山(i)建房,那么它前面的那座山(i - 1)一定不建,它的代价就与前两座山有关系。以此类推,就可以遍历全部求最值。

  我们定义一个数组dp[ i ] [ j ] [0/1 ]用来表示前 i 座山中建了 j 个房子的代价 ,最后一维表示当前第 i 座山是否建房子。

  如果这座山选择不盖房子,那么它的代价取决于前一座山的情况。

  

  如图:

  

dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1]+cost(i-1,i));//如果前一座山盖房子,那么这座山有可能挖

cost(i,j)函数表示 i 盖房子需要挖 j 挖多少代价。

int cost(int i,int j){
if(a[j]>=a[i]){
return a[j]-a[i]+1;
}else{
return 0;
}
}

如果这座山盖房子:

如图,这座山的代价与前面两座山都有关。

如果 i 选择盖房子,那么 i - 1 肯定盖不了,而 i - 2盖不盖房子会产生影响。

如果 i - 2 不盖房子,那就没什么可以担心的,直接挖 i - 1 到比 i 矮就可以了。

如果 i - 2 盖房子,那就要比较到底把 i - 1 挖到比谁矮。

dp[i][j][1]=min(dp[i-2][j-1][0]+cost(i,i-1),dp[i-2][j-1][1]+max(cost(i,i-1),cost(i-2,i-1)));

最后要输出的结果,是盖 1,2,3,……栋房子的最小代价。

首先我们需要知道最多盖几栋房子:

  设想:一共n座山,相邻山不能同时盖房子,所以要么盖1、3、5、7……要么盖2、4、6、8……

  最多盖( n + 1 )/2栋房子(自己推一下,记住整形运算自动向下取整)

这样结果就出来了,输出相应的 min(dp[ i ][ j ][ 0 ],dp[ i ][ j ][ 1 ])即可。

全代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=5010;
int dp[maxn][maxn][2],a[maxn];
int cost(int i,int j){
if(a[j]>=a[i]){
return a[j]-a[i]+1;
}else{
return 0;
}
}
int n,cnt;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
a[i]=0;
for(int j=1;j<=n;j++){
dp[i][j][0]=dp[i][j][1]=0x3fffffff;
}
}
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
dp[1][1][1]=0;
dp[2][1][1]=cost(2,1);
dp[2][1][0]=cost(1,2);
for(int i=3;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1]+cost(i-1,i));
dp[i][j][1]=min(dp[i-2][j-1][0]+cost(i,i-1),dp[i-2][j-1][1]+max(cost(i,i-1),cost(i-2,i-1))); if(2*j>=i)break;
}
}
int cnt=(n+1)/2;
for(int j=1;j<=cnt;j++){
printf("%d ",min(dp[n][j][1],dp[n][j][0]));
}
printf("\n"); }

洛谷 CF1012C Hills(动态规划)的更多相关文章

  1. 洛谷 CF1012C Hills (动态规划)

    题目大意:有n个山丘 , 可以在山丘上建房子 , 建房子的要求是 : 该山丘的左右山丘严格的矮于该山丘 (如果有的话),你有一架挖掘机,每单位时间可以给一个山丘挖一个单位的高度,问你想要建造 1,2, ...

  2. 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03

    [题目描述:] ... (宣传luogu2的内容被自动省略) 洛谷的运营组决定,如果...,那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望. Kkks ...

  3. 【洛谷】【动态规划/01背包】P2925 [USACO08DEC]干草出售Hay For Sale

    [题目描述:] 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它 ...

  4. 【洛谷】【动态规划/01背包】P1734 最大约数和

    [题目描述:] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. [输入格式:] 输入一个正整数S. [输出格式:] 输出最大的约数之和. [算法分析:] 01背包,每个数 ...

  5. 【洛谷】【动态规划+单调队列】P1714 切蛋糕

    [题目描述:] 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但 ...

  6. 【洛谷】【动态规划+单调队列】P1725 琪露诺

    [题目描述:] 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河 ...

  7. 【洛谷】【动态规划(多维)】P1006 传纸条

    [题目描述:] 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸 ...

  8. 【洛谷】【动态规划/背包】P1417 烹调方案

    由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的食物准备填 ...

  9. 【洛谷】【动态规划(二维)】P1508 Likecloud-吃、吃、吃

    [题目描述:] 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨 ...

随机推荐

  1. adb无线连接android手机进行调式,无需获得root权限

    利用adb无线连接android手机进行调式 无需获得root权限 转载来自CSDN  https://blog.csdn.net/lnking1992/article/details/5346518 ...

  2. redis加固:修改默认端口6379、密码不为空、内网服务器访问

    一.windows下redis加固: 1.修改redis密码+修改redis端口 1.1.找到服务当中redis的属性配置文件是哪个   这个是我的"D:\Program Files\Red ...

  3. [LeetCode]364. 加权嵌套序列和 II (DFS)

    题目 给一个嵌套整数序列,请你返回每个数字在序列中的加权和,它们的权重由它们的深度决定. 序列中的每一个元素要么是一个整数,要么是一个序列(这个序列中的每个元素也同样是整数或序列). 与 前一个问题 ...

  4. Shell编程(4)

    shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式 func() { #指定函数名 co ...

  5. Shell编程(3)

    1. shell流程控制 2. for语句 3. while语句 4. break和continue语句 5. case语句 6. shell编程高级实战 shell流程控制 流程控制是改变程序运行顺 ...

  6. k8s应用机密信息与配置管理(九)

    secret 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret. Secret 会以 ...

  7. CSS常用布局技巧 实例

    末尾用省略号! white-space: nowrap; overflow: hidden; text-overflow: ellipsis; ######################## 两个i ...

  8. 测试必备:jmeter测试http协议接口的各种传参方式

    测试接口,postman和jmeter是用得最频繁的工具,特别是jmeter,支持很多种协议,且除了测功能,还能做自动化测试和性能测试.下面主要介绍jmeter测试http协议接口的用法,包含get, ...

  9. volatile域浅析

    内存模型的相关概念 计算机中执行程序时,每条指令都是在CPU中执行,执行指令的过程必然会涉及到数据的读取和写入.而程序运行时的数据是存放在主存(物理内存)中,由于CPU的读写速度远远高于内存的速度,如 ...

  10. dubbo学习(九)dubbo监控中心

    安装与配置 下载地址:https://github.com/apache/dubbo-admin/tree/master(包含管理控制台和监控中心) PS:  下载前要选择master分支以后再进行下 ...