这是一道DP题...我居然有那么半个小时思考非DP解决方案,实在是太弱了。

题意:给您若干山,您可以花费1代价削去1高度,求有k个山峰时的最小代价。

输出k = 1 ~ (n + 1) >> 1的答案。

这最后一个直接限制了我的DP思路。。。后来发现,DP本来就存了这些答案的..毒瘤。

状态表示是f[i][j][0/1],表示前i座山有j个山峰,自己是不是山峰。

比较奇特的是f[i][j][1]要从f[i - 2][j - 1][0/1]转移过来,自然少不了一些奇奇怪怪的特判...

 #include <cstdio>
#include <algorithm>
#include <cstring>
typedef long long LL;
const int N = ; LL f[N][N][]; // 0 no_hill 1 hill
int a[N], n; inline int val(int i) {
if(i < ) {
return ;
}
if(i == ) {
if(a[i] < a[i + ]) {
return ;
}
return a[i] - a[i + ] + ;
}
if(a[i - ] > a[i]) {
if(a[i + ] > a[i]) {
return ;
}
return a[i] - a[i + ] + ;
}
if(a[i + ] > a[i - ] - ) {
return ;
}
return a[i - ] - a[i + ]; /// error : a[i - 1] - a[i]
}
inline int vl(int i) {
if(i < ) {
return ;
}
if(a[i] < a[i + ]) {
return ;
}
return a[i] - a[i + ] + ;
}
inline int vx(int i) {
if(i > n) {
return ;
}
if(a[i] < a[i - ]) {
return ;
}
return a[i] - a[i - ] + ;
} int main() {
memset(f, 0x3f, sizeof(f));
scanf("%d", &n);
for(int i = ; i <= n; i++) {
f[i][][] = ;
}
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
int k = (n + ) >> ; for(int j = ; j <= k; j++) {
for(int i = ; i <= n; i++) {
if(i == ) {
if(j == ) {
f[i][j][] = vx();
//printf("f[1][1][1] = %d\n", f[i][j][1]);
}
continue;
}
f[i][j][] = std::min(f[i - ][j][], f[i - ][j][]);
f[i][j][] = std::min(f[i - ][j - ][] + val(i - ), f[i - ][j - ][] + vl(i - )) + vx(i + );
//printf("f[%d][%d][0] = %d\n", i, j, f[i][j][0]);
//printf("f[%d][%d][1] = %d\n", i, j, f[i][j][1]);
}
}
/*
10
2 2 4 4 3 1 1 2 3 2
*/
for(int i = ; i <= k; i++) {
printf("%I64d ", std::min(f[n][i][], f[n][i][]));
} return ;
}

AC代码

CF 1013E Hills的更多相关文章

  1. CF 1013E Hills——隔项转移的DP

    题目:http://codeforces.com/contest/1013/problem/E 设 dp[ i ][ j ][ 0/1 ] 表示前 i 个位置,有 j 个山峰,第 i 个位置不是/是山 ...

  2. DP擎天

    DP! 黄题: 洛谷P2101 命运石之门的选择 假装是DP(分治 + ST表) CF 982C Cut 'em all! 树形贪心 洛谷P1020 导弹拦截 单调队列水题 绿题: 洛谷P1594 护 ...

  3. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  6. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  7. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  9. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

随机推荐

  1. 给普通用户添加root权限

    >>提君博客原创  http://www.cnblogs.com/tijun/  << 第一步,以root用户查看/etc/sudoers [root@ltt2 hadoop] ...

  2. 爬虫 之Requests库的详细使用

    1.什么是Requests? Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库. 它比urllib更加方便,可以节约我 ...

  3. python爬虫之redis环境简单部署

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...

  4. python爬虫之Beautiful Soup的基本使用

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  5. Linux基础学习(15)--启动管理

    第十五章——启动管理 一.CentOS 6.x启动管理 1.系统运行级别: (1)运行级别: (2)运行级别命令: (3)系统默认运行级别: 2.系统启动过程: . 二.启动引导程序grub 1.Gr ...

  6. LODOP.FORMAT格式转换【回调和直接返回值】

    Lodop中有一些格式转换函数,这些函数和其他众多函数一样,c-lodop需要使用回调函数On_Return返回,Lodop插件方式直接返回,通常混合部署,写法要兼容两个控件.可以用if (LODOP ...

  7. 训练赛-Building Numbers

    题意:首先告诉你,一个数字从1开始有两种变换方式:1.当前数字的值加1 2.当前的数字值乘2: 思路:首先把数组里的数字需要的变换次数算出来,然后用前缀和解决: 代码: #include<ios ...

  8. Jquery根据滚动条显示返回按钮

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  9. BZOJ3676[Apio2014]回文串——回文自动机

    题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. 输入 输入只有一行,为一个只包含小写字 ...

  10. Codeforces Round #446 Div. 1

    B:即使看到n<=22也应该猜到这只是为了写spj.将每个数替换为恰好比他大的数即可,最大值替换为最小值.这样原序列中不包含最小值的集合显然都满足条件,并且容易发现包含最小值的集合的变化量都是最 ...