博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「SCOI2014」方伯伯的玉米田 解题报告
阅读量:4921 次
发布时间:2019-06-11

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


发现是取一个最长不下降子序列

我们一定可以把一个区间加的右端点放在取出的子序列的最右边,然后就可以dp了

\(dp_{i,j}\)代表前\(i\)个玉米田末尾为\(i\)拔高过\(j\)次的最大答案

\[ dp_{i,j}=\max dp_{k,l}+1(k<i,h_i+j\ge h_k+l) \]
发现可以维护的样子

维护一个\(f_{i,j}\)表示小于等于\(i\)高度(拔过后)拔的次数小于等于\(j\)次的最大值

直接二维树状数组搞就行了


Code

#include 
#include
int max(int x,int y){return x>y?x:y;}int n,m,k,a[10010],f[6010][510];int query(int x,int y){ int ret=-(1<<30); for(int i=x;i;i-=i&-i) for(int j=y;j;j-=j&-j) ret=max(ret,f[i][j]); return ret;}void modify(int x,int y,int d){ for(int i=x;i<=m;i+=i&-i) for(int j=y;j<=k;j+=j&-j) f[i][j]=max(f[i][j],d);}int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",a+i),m=max(m,++a[i]); m+=++k; memset(f,-0x3f,sizeof f); modify(1,1,0); int ans=0; for(int i=1;i<=n;i++) for(int j=k-1;~j;j--) { int yuy=query(a[i]+j,j+1)+1; ans=max(ans,yuy); modify(a[i]+j,j+1,yuy); } printf("%d\n",ans); return 0;}

2019.2.22

转载于:https://www.cnblogs.com/butterflydew/p/10419361.html

你可能感兴趣的文章
JavaScript 中 类型转换
查看>>
HDU 1069 Monkey and Banana(DP)
查看>>
HDU 2577 How to Type(杭电300题纪念)
查看>>
TestNG中的DataProvider返回Iterator<Object[]>的妙用
查看>>
WebApi使用二进制方式上传和下载文件
查看>>
CS224n学习笔记(二)
查看>>
pymysql模块
查看>>
ThreadLocal
查看>>
安全需求-建模归类——By Me
查看>>
面向对象chapter7
查看>>
关于gcc、glibc和binutils模块之间的关系
查看>>
NB的新技术
查看>>
并查集
查看>>
centos 5.6 升级php到5.3
查看>>
Java两种延时——thread和timer
查看>>
让vim能完成代码提示~~
查看>>
【Android】java.lang.StackOverflowError: stack size 8MB
查看>>
12 个 CSS 高级技巧汇总
查看>>
Node.js 系列01
查看>>
源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。
查看>>