洛谷 CF1012C Hills (动态规划)
题目大意:有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 (动态规划)的更多相关文章
- 洛谷 CF1012C Hills(动态规划)
题目大意: 有几座山,如果一座山左右两边的山比它矮,那么可以在这个山上建房子,你有一台挖掘机,每天可以挖一座山一米,问你需要花多少代价可以分别盖1.2.3--座房子.(给出山的数量,以及每座山的高度) ...
- 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03
[题目描述:] ... (宣传luogu2的内容被自动省略) 洛谷的运营组决定,如果...,那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望. Kkks ...
- 【洛谷】【动态规划/01背包】P2925 [USACO08DEC]干草出售Hay For Sale
[题目描述:] 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它 ...
- 【洛谷】【动态规划/01背包】P1734 最大约数和
[题目描述:] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. [输入格式:] 输入一个正整数S. [输出格式:] 输出最大的约数之和. [算法分析:] 01背包,每个数 ...
- 【洛谷】【动态规划+单调队列】P1714 切蛋糕
[题目描述:] 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但 ...
- 【洛谷】【动态规划+单调队列】P1725 琪露诺
[题目描述:] 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河 ...
- 【洛谷】【动态规划(多维)】P1006 传纸条
[题目描述:] 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸 ...
- 【洛谷】【动态规划/背包】P1417 烹调方案
由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的食物准备填 ...
- 【洛谷】【动态规划(二维)】P1508 Likecloud-吃、吃、吃
[题目描述:] 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨 ...
随机推荐
- CentOS安装Python3.5
1. 安装python3.5可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel s ...
- 【算法基础】KMP字符串
给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入格式 第一行输入整 ...
- Alpha冲刺 —— 5.9
这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.总 ...
- jchdl - RTL Data Types
https://mp.weixin.qq.com/s/hWYW1Bn---WhpwVu2e98qA 一. Bit 类结构如下: 主要属性: value: bit的值,只支持0,1, ...
- Java实现 蓝桥杯VIP 算法训练 无权最长链
试题 算法训练 无权最长链 问题描述 给定一个n节点m边的无圈且连通的图,求直径 输入格式 第一行两个数字n,m 接下来m行每行两个数字x,y,代表x,y之间有一条边 输出格式 要求用户的输出满足的格 ...
- Java实现 LeetCode 566 重塑矩阵(遍历矩阵)
566. 重塑矩阵 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表 ...
- Java实现第九届蓝桥杯方格计数
方格计数 题目描述 如图p1.png所示,在二维平面上有无数个1x1的小方格. 我们以某个小方格的一个顶点为圆心画一个半径为1000的圆. 你能计算出这个圆里有多少个完整的小方格吗? 注意:需要提交的 ...
- redis的持久化(RDB与AOF)
1.为什么redis要实现持久化? 避免因宕机.断电等场景导致进程退出后数据丢失,如果redis的数据都只存放于内存,那么进程退出后数据就丢失了.持久化机制可以持久化内存数据到硬盘,重启redis后基 ...
- FastJson将Java对象转换成json
确保环境依赖都配置好! 1.在pom.xml导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifac ...
- 记录一次更改服务器名称导致mysql 不能正常登录、启动
由于客户要求更改服务器的名称,以便区分多台服务器:修改前mysql 能正常登录,但是修改后,登录时报错: Enter password: ERROR 1524 (HY000): Plugin '*C6 ...