【动态规划】【树状数组】[USACO2011 FEB]奶牛抗议
2015-07-17 22:10
375 查看
这道题目的关键就是想到用树状数组对DP进行优化,首先令f(i)f(i)表示分到第i个的时候子段和大于等于0的时候出现的最大的种树, 那么可以发现f(i)=∑f(j)|sum(i)−sum(j)≥0f(i)=\sum f(j) | sum(i)-sum(j)\ge 0那么后面的部分可以变成sum(i)≥sum(j)sum(i)\ge sum(j)那么就可以使用树状数组进行维护,下标就是sum(j)sum(j)存的就是f(j)f(j)因为sum(j)sum(j)还是很大的所以离散化一下就好了。
[code]#include <cstdio> #include <algorithm> #include <iostream> using namespace std; const int MAXN = 100000; const int MOD = 1e9+9; int Tree[MAXN * 4+10], n, ls[MAXN+10], lLen, sum[MAXN+10]; int f[MAXN+10]; int bit(int u){return (u&(-u));} void add(int u, int v){ while(u <= lLen){ Tree[u] = Tree[u] + v; Tree[u] %= MOD; u += bit(u); } } int query(int u){ int ret = 0; while(u > 0){ ret += Tree[u]; ret %= MOD; u -= bit(u); } return ret; } int main(){ int n; scanf("%d", &n); for(int i=1;i<=n;i++){ scanf("%d", &sum[i]); sum[i] += sum[i-1]; ls[i+1] = sum[i]; } ls[1] = 0; sort(ls+1, ls+n+2); lLen = unique(ls+1, ls+n+2) - ls - 1; add(lower_bound(ls+1, ls+lLen+1, 0) - ls, 1); //printf("%d\n", query(1)); for(int i=1;i<=n;i++){ f[i] = query(lower_bound(ls+1, ls+lLen+1, sum[i]) - ls); add(lower_bound(ls+1, ls+lLen+1, sum[i]) - ls, f[i]); } printf("%d\n", f ); return 0; }
相关文章推荐
- html与JacaScript中的重要思想:预留后路、向后兼容、js分离
- CSS3弹性盒模型之box-flex
- js 按值选中选项
- 基于jQuery左右滑动切换特效 附源码
- 基于jQuery左右滑动切换特效 附源码
- JSP路径出现故障
- JavaScript对象字面量
- AngularJS性能优化心得,自己踩过的抗,及一些别人的经验(转哦)
- CSS3盒模型之box-sizing
- css与js语法对照
- Node实践之二
- JavaScript判断undefined的技巧
- 运行html代码
- JavaScript学习要点(一)
- CSS3 变形记
- StackOverFlow精彩问答赏析:有jQuery背景的开发者如何建立起AngularJS的思维模式?
- (简单) POJ 2492 A Bug's Life,二分染色。
- jQuery框架下的多选文本框
- javascript生成对象编程模式
- jquery $(document)