Hills

题目大意

从n个数选取k个数,如果选第i个数,必须h[i−1]<h[i]>h[i+1]h[i−1]<h[i]>h[i+1],每花费1可以将对应的h减小1,问你选取k个数的最小花费。输出k=1,2,3,⋯(n+1)/21,2,3,⋯(n+1)/2的这些情况。

数据范围

1≤n≤5000,1≤hi≤1000001≤n≤5000,1≤hi≤100000

解题思路

dp[i][j][k]dp[i][j][k]代表前i个数选j个状态为k的最小花费,k取0和1,dp[i][j][0]dp[i][j][0]代表前i个数选j个最后一个数是前i个的最小花费,dp[i][j][1]dp[i][j][1]代表前i个数选j个最后一个数是i的最小花费。

那么dp[i][j][0]=min(dp[i−1][j][0],dp[i−1][j][1]+max(0,h[i]−h[i−1]+1))dp[i][j][0]=min(dp[i−1][j][0],dp[i−1][j][1]+max(0,h[i]−h[i−1]+1))

同样dp[i][j][1]=min(dp[i−2][j−1][0]+max(0,h[i−1]−h[i]+1,dp[i−2][j−1][1]+max(0,h[i−1]−min(h[i−2],h[i]))))dp[i][j][1]=min(dp[i−2][j−1][0]+max(0,h[i−1]−h[i]+1,dp[i−2][j−1][1]+max(0,h[i−1]−min(h[i−2],h[i]))))

AC代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int INF = 1e9;
const int maxn = 5000;
int dp[maxn + 5][maxn / 2 + 5][2];
//dp[i][j][0]代表前i个选j个且以i之前的为最后一个的最小花费;
//dp[i][j][1]代表前i个选j个且以i为最后一个的最小花费;
int h[maxn + 5];
int n;
int main() {scanf("%d", &n);for(int i = 1; i <= n; i++)scanf("%d", &h[i]);int m = (n + 1) / 2;for(int i = 0; i <= n; i++) {for(int j = 0; j <= m; j++)dp[i][j][0] = dp[i][j][1] = INF;dp[i][0][0] = 0;}dp[1][1][1] = 0;for(int i = 2; i <= n; i++)for(int j = 1; j <= m; j++) {dp[i][j][0] = min(dp[i - 1][j][0], dp[i - 1][j][1] + max(0, h[i] - h[i - 1] + 1));dp[i][j][1] = min(dp[i - 2][j - 1][1] + max(0, h[i - 1] - min(h[i - 2], h[i]) + 1), dp[i - 2][j - 1][0] + max(0, h[i - 1] - h[i] + 1));}for(int i = 1; i <= m; i++)printf("%d ", min(dp[n][i][0], dp[n][i][1]));return 0;
}

转载于:https://www.cnblogs.com/TRDD/p/9813504.html

codeforces1013E - DP相关推荐

  1. dp,sp,px相互转化

    方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. HDU 2084 数塔(DP)(JAVA版)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  4. dp cf 20190615

    A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...

  5. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  6. [NOI2005]聪聪与可可(期望dp)

    题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...

  7. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  8. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  9. 尼克的任务 dp 洛谷1280

    蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,, 首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始 ...

最新文章

  1. 分布式计算第四章 RMI
  2. 特征值_陶哲轩数学发现的故事 | 特征值特征向量等式
  3. php代码加文件后缀,php中一行代码获取文件后缀名
  4. java窗体线条切换消失_java – 如何更改apache poi生成的图表不使用平滑线条并将空单元格显示为间隙?...
  5. matlab 模拟滤波器转换为数字滤波器,一种模拟滤波电路数字化方法
  6. python指定时间执行程序_如何在特定时间执行程序
  7. Jmeter使用SSL(HTTPS协议)
  8. Spring ApplicationListener 事件监听器,能监听容器中所有实例
  9. 猜数字游戏编程C语言0到9,【游戏编程】猜数字游戏(C语言)
  10. 行路难PPT计算机考试,《行路难》公开课.ppt
  11. python调用qq互联_实现QQ互联一键登录代码教程
  12. html在手机显示时间,手机北京时间校准
  13. moss2007安装部署历程 .
  14. 飞秋怎么搜索指定ip好友_飞秋怎么加好友
  15. Audacity的替代品
  16. 一个骗人的恶劣网站: GPS 定位好友 的传说 ( 其中一个域名是 ipl38.com 诈骗:利用手机号码GPS卫星追踪你的他(她)在什么位置
  17. 2019我的公众号回顾
  18. c语言程序中计算圆的面积,C代码:使用概率的方法计算圆的面积
  19. cyk的小学数学题 小学数学
  20. PDF文件转为缩略图

热门文章

  1. vfp生成菜单时文件不存在_如何在VFP项目中创建菜单
  2. linux0.11 init函数,linux0.11启动与初始化
  3. Python提示ModuleNotFoundError: No module named ‘PIL‘,已解决
  4. android 自定义窗口,Android studio如何自定义设置窗口布局?
  5. mysql怎么用sb文件_初识mysql数据库
  6. java 新项目计划_Java的新项目学成在线笔记-day6(十二)
  7. sunplus 8202v iop源代码阅读笔记——1
  8. ANSI字符与Unicode字符的互相转换
  9. 学习 Linux LVM
  10. 英语总结系列(二):爽约Pauel叔十五天