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个点的一条路径 ...
随机推荐
- 直播内容大面积偏轨:都是high点的错?
当下的直播行业看似火爆,却是外强中干.直播平台数量的暴增.主播人数的飙升.直播内容同质化严重等问题,都在成为新的行业症结.而面对复杂的情况,不仅刚入行的小主播,就连爆红的大主播都感到寒冬的难熬.为了能 ...
- Android开发 run的时候出现waiting for debugger的情况,及解决问题
出现原因:不清楚,大概推测是因为缓存没有清除干净 解决方法: 方法一. 重新启动模拟器 好像就点右上角的x符号是没有用的,因为会保存状态,在关闭之后还要点击Cold Boot Now,冷启动,才会把之 ...
- 容器内init进程方案
背景 进程标识符 (PID) 是Linux 内核为每个进程提供的唯一标识符.熟悉docker的同学都知道, 所有的进程 PID都属于某一个PID namespaces, 也就是说容器具有一组自己的 P ...
- 微信小程序转化为uni-app项目
前言: 之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的功能,但是由于自己前端抠脚的原因没有写出来,然后自己在网上搜索的时候发现了有个微信小程序里面的页面及其的符合我的需求.那么问题 ...
- HTTP GET请求302重定向问题
1.问题描述 ① 在华为云服务器中搭建了java环境,并在tomcat中部署了一个空的web项目 ② 在此web项目中上传了一个名为:plugin_DTDREAM_LIVING_DEHUMIDIFIE ...
- OpenCV中Mat的基本用法:创建、复制
OpenCV中Mat的基本用法:创建.复制 一.Mat类的创建: 1.方法一: 通过读入一张图像,直接将其转换成Mat对象. Mat image = imread("test.jpg&quo ...
- nes 红白机模拟器 第4篇 linux 手柄驱动支持
小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...
- 【音视频连载-001】基础学习篇- SDL 介绍以及工程配置
技术开发故事会连载 这是音视频基础学习系列的第一篇文章,主要讲解 SDL 是什么以及为什么要用到它,看似和音视频没啥卵关系,其实必不可少. SDL 简介 SDL 是 "Simple Dire ...
- NoVNC安装部署
noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制面板中,比如 Op ...
- Serverless与微服务
Serverless 是一个更大的范畴,Serverless 不只计算,也包括存储.数据库.中间件等各种服务.Serverless = FaaS(函数即服务) + BaaS(后端即服务).其中 Ser ...