博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1012C Hills
阅读量:5966 次
发布时间:2019-06-19

本文共 1260 字,大约阅读时间需要 4 分钟。

显然的DP是,dp[i][j][val]

val是1e6的

简化

发现,其实决策很有限,最优解的i-1的val选择有限

这里的一个trick是,f[i][j][0]转移不考虑a[i]和a[i-1]的大小关系,如果不计算到j的话,只能更差,而且之后会有一种方案记录到

这样,保留了一种可能的a[i]>a[i-1]的0状态,所以后面1的转移就存在这种情况。

代码:

#include
#define reg register int#define il inline#define numb (ch^'0')using namespace std;typedef long long ll;il void rd(int &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=5005;const int inf=0x3f3f3f3f;int f[N][N][3];int a[N];int n;int main(){ rd(n); for(reg i=1;i<=n;++i) rd(a[i]); memset(f,inf,sizeof f); f[1][0][0]=0,f[1][1][1]=0; for(reg i=2;i<=n;++i){ for(reg j=0;j<=(i+1)/2;++j){ f[i][j][0]=min(f[i-1][j][0],f[i-1][j][2]); f[i][j][1]=min(f[i-1][j-1][0]+max(0,a[i-1]-a[i]+1),f[i-1][j-1][2]+max(0,min(a[i-2]-1,a[i-1])-a[i]+1)); f[i][j][2]=f[i-1][j][1]+max(0,a[i]-a[i-1]+1); } } for(reg k=1;k<=(n+1)/2;++k){ printf("%d ",min(f[n][k][0],min(f[n][k][1],f[n][k][2]))); } return 0;}}signed main(){ Miracle::main(); return 0;}/* Author: *Miracle* Date: 2019/2/22 21:32:02*/

 

转载于:https://www.cnblogs.com/Miracevin/p/10420885.html

你可能感兴趣的文章
Ext JS 6开发实例(三) :主界面设计
查看>>
【原创】Oracle RAC原理和安装
查看>>
东哥读书小记 之 《MacTalk人生元编程》
查看>>
《随机出题软件》&《随机分队软件》源码(Windows API)
查看>>
python 文件及文件夹操作
查看>>
Android自定义ListView的Item无法响应OnItemClick的解决办法
查看>>
Building Apps for Windows Phone 8.1教程下载地址整理
查看>>
移动Web—CSS为Retina屏幕替换更高质量的图片
查看>>
[Linux 性能检测工具]SAR
查看>>
JS 运行、复制、另存为 代码。
查看>>
一个经典编程面试题的“隐退”
查看>>
阿里公共DNS 正式发布了
查看>>
Java抓取网页数据(原网页+Javascript返回数据)
查看>>
EasyUI基础入门之Pagination(分页)
查看>>
ORACLE中CONSTRAINT的四对属性
查看>>
python 迭代器 生成器
查看>>
dorado基本事件样例
查看>>
Python访问PostGIS(建表、空间索引、分区表)
查看>>
quick-cocos2d-x开发环境Lua for IntelliJ IDEA的安装
查看>>
Target-Action回调模式
查看>>