CF 1012C Dp
Welcome to Innopolis city. Throughout the whole year, Innopolis citizens suffer from everlasting city construction.
From the window in your room, you see the sequence of n hills, where i-th of them has height ai. The Innopolis administration wants to build some houses on the hills. However, for the sake of city appearance, a house can be only built on the hill, which is strictly higher than neighbouring hills (if they are present). For example, if the sequence of heights is 5, 4, 6, 2, then houses could be built on hills with heights 5 and 6 only.
The Innopolis administration has an excavator, that can decrease the height of an arbitrary hill by one in one hour. The excavator can only work on one hill at a time. It is allowed to decrease hills up to zero height, or even to negative values. Increasing height of any hill is impossible. The city administration wants to build k houses, so there must be at least k hills that satisfy the condition above. What is the minimum time required to adjust the hills to achieve the administration's plan?
However, the exact value of k is not yet determined, so could you please calculate answers for all k in range ? Here denotes n divided by two, rounded up.
分析
先来分析状态的定义,首先输出的时候跟k有关,所以k一定要先占一个状态,山的数目也要占一个状态,因为不枚举每座山峰,就无法知道山峰的高度,那么状态可不可以只有i和j呢?显然也不可以,建房子的时候有高度限制。于是状态大致就有了,是一个三维的状态,dp[i][k][],那么剩下的那个状态怎么选呢,因为我们转移的时候只考虑了前边的i个,所以第i个建不建,只与第i-1个有关,i与i-1建房的情况有三种,都不建,i建,i-1建,i和i-1都建呢?请回去读题。所以定义dp[i][j][0..2],表示前i个山,建j个房子,0:i和i-1都不建,1:i建,2:i-1建时最小花费。接下来考虑状态转移,对于0的情况,就是dp[i-1][j][0]和
dp[i-1][j][2]的情况,前者是i-1和i-2都不建,后者是i-1不建,i-2建。这两种情况都是满足我们这个状态并且合起来正好能够填满这个状态。对于1的情况,i建了,那么i-1一定不能建,考虑i-2建还是不建,如果i-2建了,那么i-1的山峰就要满足比i-2和i都小,如果i-1比i-2要高,那么i-1就至少要被砍到i-2的高度-1的位置,即min(a[i-1],a[i-2]-1),如果这个数还比i高,那么它还要被砍,于是额外的代价就是h-(a[i]-1),所以总代价就是dp[i-1][j-1][2]+max(0,min(a[i-1],a[i-2]-1)-a[i]+1),再考虑i-2不建的情况,就是看i-1需不需要砍一刀,所以这个状态最后的转移方程就是:
dp[i][j][1]=min(dp[i-1][j-1][0]+max(0,a[i-1]-a[i]+1),dp[i-1][j-1][2]+max(0,min(a[i-1],a[i-2]-1)-a[i]+1));
虽然有点长但是好好理解一下还是挺好懂得,最后就是2的情况了,如果i-1建了,那么就要保证i的高度低于i-1于是取a[i]-a[i-1]+1和0的最大值就行。最后可以小小的优化一下,状态转移的时候,i能且只能由i-1转移过来,所以第一维状态可以省略。
最后就是初始化了,由于要求最小,所以最开始全部初始化为INF,初态dp[0][0],dp[1][1]均为0,稍微解释一下,建0座房子,显然叭,不花钱,建一个,也不花。
tips::压维的话注意一点,转移的时候,要考虑转移顺序,先转移0,因为0受2的影响,再转移2,2受1的影响,最后是1,这样就可以避免用现阶段的东西来转移现阶段的东西,从而保证了转移的正确性。
#include<iostream>
#include<cstring>
using namespace std;
const int N=;
int dp[N][],a[N<<];
int main(){
int n;
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i];
memset(dp,0x3f,sizeof(dp));
dp[][]=dp[][]=;
for(int i=;i<=n;i++)
for(int j=i+>>;j;j--){
dp[j][]=min(dp[j][],dp[j][]);
dp[j][]=dp[j][]+max(,a[i]-a[i-]+);
dp[j][]=min(dp[j-][]+max(,a[i-]-a[i]+),dp[j-][]+max(,min(a[i-],a[i-]-)-a[i]+));
}
for(int j=;j<=n+>>;j++)
cout<<min(dp[j][],min(dp[j][],dp[j][]))<<" ";
}
CF 1012C Dp的更多相关文章
- cf 710E dp
题目链接: http://codeforces.com/problemset/problem/710/E 题意:要输入n个字符'a',有两种操作,一种是输入或删除一个'a',耗时x:另一种是把当前的整 ...
- 动态规划dp专题练习
貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3 ...
- sdut2879 枚举起点DP
这个题和乌龟棋之类的DP差不多要学会缩减状态 就是,,我们只需枚举当前这个人是谁,选什么颜色,A用了多少,B用了多少 C用了多少我们就不用枚举了,知道选了多少人,A,B用了多少,你还不知C用了多少么, ...
- 题解 AT2390 【Games on DAG】
题目大意 给出一个n个点m条边的DAG,记为G. 可以删掉若干条边成为G′,显然有 2m 种不同的G′. 连边保证:若有 (xi →yi) 边,则 xi < yi . 初始点1和点2有一个标 ...
- nexys4ddr数码管动态扫描Verilog例程
题目:实现数码管动态扫描功能,将十六个开关的值以十六进制的方式在4个数码管上同时显示出来. `timescale 1ns / 1ps module top( clk, sw, seg, an ); / ...
- 关于国债的一些计算: 理论TF价格1(缴款日前无付息)
计算 ExpectedTFPrice 是一个比较复杂的计算,我们这里讨论简单的一种情况. 给定一只可交割国债bond(一般为CTD),一个国债期货tf,一个日期t(表示tf的一个交易日期,我们通过t日 ...
- CSP-S乱搞记
还有一年的时间,没人能挡住我前进的脚步 以后不打算写游记了,补完这篇再写就等退役吧,不太想传播什么负能量,走这条路,希望能得到自己想要的东西 Day-n 上了一个月文化课,班主任突然催我搞竞赛??? ...
- BZOJ 3601 一个人的数论 (拉格朗日插值+莫比乌斯反演)
题意 略 题解 orz Freopen的博客 CODE #pragma GCC optimize (3) #include <bits/stdc++.h> using namespace ...
- CF #374 (Div. 2) C. Journey dp
1.CF #374 (Div. 2) C. Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...
随机推荐
- 通过python脚本读取多台虚机硬件信息
主要通过fabric模块实现 import fabric ''' hosts = [] ,): host = "192.168.75." + str(i) hosts.append ...
- py函数式编程
函数式编程把计算视为函数而非指令,纯函数式编程不需要变量,没有副作用,测试简单,python支持的函数式编程不是纯函数式编程,允许有变量存在,支持高阶函数,支持闭包,有限度的支持匿名函数 变量可以指向 ...
- czC#01
1. .net简介: .net分为.net平台及.net Framework 2..NET作用 2.转义与@ 3.类型转换 1) 隐式转换 2)显式类型转换 (待转换的目标类型)原始值
- css实现边框动画效果
最近写了几个页面都用到css动画,以及很多before,after伪类.在此记录一下成果.css边框循环动画,页面效果如下: 1.沿着边框动画的图形使用before,after伪类写的.当时想用切图来 ...
- python入门到放弃-基本数据类型之tuple元组
#概述 元组俗称不可变的列表,又称只读列表,是python的基本数据类型之一, 用()小括号表示,里面使用,逗号隔开 元组里面可以放任何的数据类型的数据,查询可以,循环可以,但是就是不能修改 #先来看 ...
- Vuex的理解以及它的辅助函数
理解:vue中的“单向数据流”,这里借用官网的图示: Vue是单向数据流,v-model只是语法糖而已.单向数据流就是:数据总是[向下传递]从父级组件传递给子组件,只能单向绑定.子组件内部不能直接修改 ...
- element多层导航菜单
很久没写博客了原因就是懒, 刚下班今天写了个基于element导航菜单实现多层菜单(可以无限多层) 组件核心思想就是组件递归(这个有时候面试会问到) 然后就判断children有没有内容,没内容就是选 ...
- C语言程序设计(七) 函数
第七章 函数 分而治之: 把较大的任务分解成若干较小.较简单的任务,并提炼出公用任务的方法 函数是C语言中模块化程序设计的最小单位,既可以把每个函数都看作一个模块,也可以将若干相关的函数合并成一个模块 ...
- (转)C++中的new
转载自:http://blog.csdn.net/sparkliang/article/details/3650324 C++中的new其实是一个很糊弄人的术语,它有两种不同的含义,new运算符(ne ...
- Oracle - 各类文件损坏处理办法(附实验步骤)
一.概述 本文将给大家介绍oracle各类文件损坏的现象和应对策略,请注意所有的恢复都是基于有备份的情况,所以请开启数据库的日常备份.文章将从以下文件展开 a. 密码文件 b. 参数文件 c. 控制文 ...