BZOJ 1996 HNOI 2010 chorus 合唱队 区间DP
2016-02-28 12:17
405 查看
发现每次都只在最左最右加一个数字,因此可以用区间DP。
如果我们已经知道了区间[i,j]的方案数,而且是在区间前面加了数字,那么其能贡献的区间有:
[i,j+1](aj+1>ai)
[i−1,j](ai−1<ai)
相对的在后面加了数字也类似。
那么就好办了,需要三维表示状态区间左右端点以及在前还是后加了数字。方程就按照上面的即可。
如果我们已经知道了区间[i,j]的方案数,而且是在区间前面加了数字,那么其能贡献的区间有:
[i,j+1](aj+1>ai)
[i−1,j](ai−1<ai)
相对的在后面加了数字也类似。
那么就好办了,需要三维表示状态区间左右端点以及在前还是后加了数字。方程就按照上面的即可。
#include <cstdio> const int MOD = 19650827, N = 1001; void add(int &a, int b) { (a += b) %= MOD; } int f , g , a , n, i, j; int main() { scanf("%d", &n); for(i=1;i<=n;i++) scanf("%d", a + i), f[i][i] = 1; for(i=n;i;i--) for(j=i+1;j<=n;j++) { if (a[i] < a[i + 1]) add(f[i][j], f[i + 1][j]); if (a[i] < a[j]) add(f[i][j], g[i + 1][j]); if (a[j] > a[i]) add(g[i][j], f[i][j - 1]); if (a[j] > a[j - 1]) add(g[i][j], g[i][j - 1]); } printf("%d", (f[1] + g[1] ) % MOD); return 0; }
相关文章推荐
- Faster R-CNN是如何添加ROIPoolingLayer和SmoothL1LossLayer的?
- 《Linux内核分析》-X86汇编基础及实验总结
- Runloop 理解
- 23种设计模式详解(Java示例)->适用于所有OO语言
- 机器学习笔记(二)——多变量最小二乘法
- Web 播放声音 — AMR(Audio) 篇
- Web 播放声音(AMR 、WAVE)
- Web 播放声音 — Flash 篇 (播放 AMR、WAV)
- VNC view 连接后闪退
- Arduino作为编程器读写BIOS、bootloader、uboot或者breed
- genymotion下载出现Unable to create virtual device,Server returned HTTP status code 0.
- 每日一小练——Eratosthenes 筛选法
- [Android]自定义控件LoadMoreRecyclerView
- 2-10-归并扩展的线性单链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- JavaScipt学习中的高阶函数
- andriod读写XML
- ZooKeeper个人笔记之节点的监听
- PAT (Top Level) Practise 1006 Tree Traversals - Hard Version (35)
- SQL分页排序的实现
- Android: 解决动画完成后位置恢复到初始位置的问题