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

输入:n个山丘的高度

输出:分别输出建造1,2,3……个房子的代价

分析:可以易得出两个性质

  1. 不可能连续两个山丘都建造房子

  2.如果该山丘建造房子就不可能挖该山丘(因为要保证该山丘严格的高于附近两个山丘,如果将该山丘高度降低,只能得到不会更优的结果)

那么我们可以讲每一个山丘 是否建造房子,用一维来表示,0代表不建造房子,1代表建造房子。

一共有n个山丘 假设要建造 m 座房子,那么我们用 i 来表示当前所处的山丘,用 j 来表示在此山丘以前已经建造了多少座房子

则f[i][j][1/0]

现在分析一下 第i座山丘不建造房子的情况

如果第i座山丘不建造房子 ,那么i - 1座可能建造也可能不建造,在两者中取一个较小值(注意i - 2座山丘,因为i 座山丘不建造,所以i - 2座山丘是否建造都不会对第i座山丘产生影响)

因此

f[i][j][0] = min{f[i-1][j][0],f[i-1][j][1] + max{0,a[i-1] - a[i] +1}}

(a[i]存储第i座山峰的高度,这里因为要保证严格的高于周围山峰,所以还要加上1)

然后分析第i座山峰建造房子的情况

如果第i座山峰建造房子,那么第i-1座只能不建造,但是这里需要注意的是,如果第i - 2 座山峰要建造房子的话,那么第 i - 1座山丘就不仅仅需要满足比 第 i 座山丘矮,还需要保证比i - 2矮,所以需要比较一下两者的较大值作为代价

因此

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

下面是代码全貌

#include<bits/stdc++.h>
using namespace std; const int maxn = 5000+10;;
int n,a[maxn],dp[maxn],f[maxn][maxn][2]; int main(){
memset(f,0x3f,sizeof(f));
f[0][0][0] = 0;
f[1][1][1] = 0;
f[1][0][0] = 0;
scanf("%d",&n);
for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
dp[0] = 0x3fffffff;
for(int i = 2;i <= n;++i){
f[i][0][0] = f[i-1][0][0];
for(int j = 1;j <= (i+1)/2;++j){
f[i][j][1] = min(f[i-2][j-1][0]+max(0,a[i-1]-a[i]+1), f[i-2][j-1][1]+max(0,a[i-1]-min(a[i],a[i-2])+1));
f[i][j][0] = min(f[i-1][j][0],f[i-1][j][1]+max(0,a[i]-a[i-1]+1));
}
}
for(int i = 1;i <= (n + 1)/2;++i){
printf("%d ",min(f[n][i][0],f[n][i][1]));
}
return 0;
}

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

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

    题目大意: 有几座山,如果一座山左右两边的山比它矮,那么可以在这个山上建房子,你有一台挖掘机,每天可以挖一座山一米,问你需要花多少代价可以分别盖1.2.3--座房子.(给出山的数量,以及每座山的高度) ...

  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. Beta冲刺 —— 6.1

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.讨论并解决每个人存在的问 ...

  2. Python机器学习笔记:SVM(1)——SVM概述

    前言 整理SVM(support vector machine)的笔记是一个非常麻烦的事情,一方面这个东西本来就不好理解,要深入学习需要花费大量的时间和精力,另一方面我本身也是个初学者,整理起来难免思 ...

  3. 数据库之 MySQL --- 视图的原理解析与创建(八)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.什么是视图? 视图:MySQL从5.0.1版本开始提供视图功能.一种虚拟存在的表,行和列的数据来自定 ...

  4. WALT(Window Assisted Load Tracking)学习

    QCOM平台使用WALT(Window Assisted Load Tracking)作为CPU load tracking的方法:相对地,ARM使用的是PELT(Per-Entity Load Tr ...

  5. Java实现 LeetCode 93 复原IP地址

    93. 复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11. ...

  6. Java实现 LeetCode 11 盛最多水的容器

    11. 盛最多水的容器 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) ...

  7. Java实现 蓝桥杯 算法提高 奥运会开幕式

    试题 算法提高 奥运会开幕式 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 学校给高一(三)班分配了一个名额,去参加奥运会的开幕式.每个人都争着要去,可是名额只有一个,怎么办?班长 ...

  8. java实现第六届蓝桥杯空心菱形

    空心菱形 标题:空心菱形 小明刚刚开发了一个小程序,可以打印出任意规模的空心菱形,规模为6时,如下图: ****** ****** ***** ***** **** **** *** *** ** * ...

  9. 【CSS】常用色值

    常用颜色: 嫣红(red):#e54d42 桔橙(orange):#f37b1d 明黄(yellow):#fbbd08 橄榄(olive):#8dc63f 森绿(green):#39b54a 天青(c ...

  10. Android Studio自定义签名文件

    在项目多人开发的时候,如果使用到第三方框架,需要keystore的sha1值的时候,则需要共享debug签名才能进行程序调试 可以在gradle文件中配置如下选项,并且把keystore文件放到项目m ...