【BC#24 1002 HDOJ 5273】Dylans loves sequence
2015-06-20 23:18
369 查看
【BC#24 1002 HDOJ 5273】Dylans loves sequence
逆序对动归 比赛时候各种奇葩姿势都上了个遍 归并也憋出来了 谁知道就给我看这个。。。。 赛后有的思路 收到赛后题解的启发 dp[l][r]是l~r之间逆序对
先暴力把dp[1][1~n]枚举出来 然后i从2~n枚举左边界 右边界从i+1~n 这样dp[i][j] 即求出了区间左端点从2往后的所有逆序对数
而dp[i][j]即为dp[i-1][j]中吧i-1的逆序对数减去的余数 这样顺序暴力即可。。。。。。还是看脑子啊TOT
代码如下
逆序对动归 比赛时候各种奇葩姿势都上了个遍 归并也憋出来了 谁知道就给我看这个。。。。 赛后有的思路 收到赛后题解的启发 dp[l][r]是l~r之间逆序对
先暴力把dp[1][1~n]枚举出来 然后i从2~n枚举左边界 右边界从i+1~n 这样dp[i][j] 即求出了区间左端点从2往后的所有逆序对数
而dp[i][j]即为dp[i-1][j]中吧i-1的逆序对数减去的余数 这样顺序暴力即可。。。。。。还是看脑子啊TOT
代码如下
#include <cstdio> using namespace std; int dp[1111][1111]; int num[1111]; int cnt[1111]; int main() { int i,n,q,j,l,r; scanf("%d %d",&n,&q); for(i = 1; i <= n; ++i) scanf("%d",&num[i]); dp[1][1] = 0; for(i = 2; i <= n; ++i) { dp[1][i] = dp[1][i-1]; for(j = 1; j < i; ++j) { if(num[j] > num[i]) dp[1][i]++; } } for(i = 2; i < n; ++i) { cnt[i-1] = num[i] < num[i-1]? 1: 0; for(j = i+1; j <= n; ++j) { if(num[i-1] > num[j]) cnt[i-1]++; dp[i][j] = dp[i-1][j] - cnt[i-1]; } } while(q--) { scanf("%d %d",&l,&r); printf("%d\n",dp[l][r]); } return 0; }
相关文章推荐
- java queue 实战
- continue:结束本次循环,继续下一次循环
- AndroidStudio新建项目时一直处于building“xxx”gradle project info状态
- 隐藏指定的UIView区域
- 自己实现基于key-value的NoSQL数据库(三)—— B+树和Hash算法
- @requestparam怎么用
- 机房重构--UI设计与单例思考
- Java并发编程-31-阻塞式优先级列表-PriorityBlockingQueue
- hdu 5273 Dylans loves sequence
- HDU 5273 Dylans loves sequence(区间DP)
- UISegmentedControl的详细使用
- hdu 5273 Dylans loves sequence
- UVa1152 - 4 Values whose Sum is 0(hash)
- UVa1605 - Building for UN(构造)
- GitLab:解决Merge Request中Commits不更新的问题
- ABP 初探 之基于EasyUI的CURD
- Ubuntu12.04配置vnc远程桌面,解决Could not acquire name on session bus问题
- hdu 5273 Dylans loves sequence 逆序数简单递推
- 11gR2 OUI安装界面的System Class和 Desktop Class
- Java-马士兵设计模式学习笔记-责任链模式-模拟处理Reques Response