3594: [Scoi2014]方伯伯的玉米田 DP+树状数组优化
2016-03-20 14:24
429 查看
由于没有发现一个正确性显然的性质..然后并没做出此题。
每次操作的右端点一定为n,因为这样有可能增加前面的答案而不会减少后面的答案。
那么我们考虑dp,用fi,j表示前i个拔高了j次的最长不降子序列长度。则fi,j=max{fx,y},x<i,y≤j,ax+y≤ai+j。后面两个限定条件可以用树状数组来限定然后求max。
每次操作的右端点一定为n,因为这样有可能增加前面的答案而不会减少后面的答案。
那么我们考虑dp,用fi,j表示前i个拔高了j次的最长不降子序列长度。则fi,j=max{fx,y},x<i,y≤j,ax+y≤ai+j。后面两个限定条件可以用树状数组来限定然后求max。
#include<iostream> #include<cstdio> using namespace std; int n,m,mx,ans; int tree[5505][505]; int a[10005],f[10005][505]; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } inline int lowbit(int i) { return (i&(-i)); } int query(int x,int y) { int tmp=0; for (int i=x;i;i-=lowbit(i)) for (int j=y;j;j-=lowbit(j)) tmp=max(tmp,tree[i][j]); return tmp; } inline void add(int x,int y,int val) { for (int i=x;i<=mx+m;i+=lowbit(i)) for (int j=y;j<=m+1;j+=lowbit(j)) tree[i][j]=max(tree[i][j],val); } int main() { n=read(); m=read(); for (int i=1;i<=n;i++) a[i]=read(),mx=max(mx,a[i]); for (int i=1;i<=n;i++) for (int j=m;~j;j--) { f[i][j]=query(a[i]+j,j+1)+1; ans=max(ans,f[i][j]); add(a[i]+j,j+1,f[i][j]); } cout << ans << endl; }
相关文章推荐
- Android应对进程被杀死--Service(五)-- 双进程Service常驻后台
- ListView的优化方法性能对比
- 【c++】求符合给定条件的整数集
- Mybatis(十)-注解配置SQL映射器(一)
- 【c++】求符合给定条件的整数集
- R中的par()函数的参数
- lintcode-medium-Find Minimum in Rotated Sorted Array II
- 速战速决---3小时快速搭建Exchange+SFB(3)
- hadoop程序员软件包
- Sublime text3 激活码
- 复利计算1.0 2.0 3.0
- JavaScript中正则表达式test()、exec()、match() 方法
- iptables介绍和简单的应用!!!
- mac Vim 使用
- Python 06 lambda函数
- 杂谈见闻
- LeetCodeOJ:2. Add Two Numbers
- 优先队列和堆 实战:HDU1242
- CentOS-7下安装MySQL5.6.22
- socketlog