1. Time Limit: 5 Sec Memory Limit: 128 MB
  2. Submit: 2611 Solved: 1526
  3. [Submit][Status][Discuss]
  4. Description
  5. 对于一个数列{ai},如果有i<jai>aj,那么我们称aiaj为一对逆序对数。若对于任意一个由1~n自然数组成的
  6. 数列,可以很容易求出有多少个逆序对数。那么逆序对数为k的这样自然数数列到底有多少个?
  7. Input
  8. 第一行为两个整数nk
  9. Output
  10. 写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果。
  11. Sample Input
  12. 4 1
  13. Sample Output
  14. 3
  15. 样例说明:
  16. 下列3个数列逆序对数都为1;分别是1 2 4 3 1 3 2 4 2 1 3 4
  17. 100%的数据 n<=1000k<=1000
  18. HINT
  19. Source
  20. Day1

先想到区间dp,发现只记录前缀就行,所以二维就可以解决。

f[i][j],前i个数,j个逆序对的方案数。

对于新加入的i+1,可以造成i+1种逆序对,所以枚举前面的就行了。

先写的暴力版本,TLE两个点,一算10000*1000没爆int,把mod放外面,快了不少,过了一个点,然后循环展开,不开o2也跑得飞快(相较朴素暴力…)

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n,k;
  5. int f[1005][1005]={1};
  6. int main(){
  7. scanf("%d%d",&n,&k);
  8. for(register int i=1;i<=n;i++){
  9. for(register int j=0;j<=k;j++){
  10. int l=0;
  11. for(l=0;l<i-8;l+=8){
  12. if(j<l) continue;
  13. f[i][j]+=f[i-1][j-l];
  14. if(j<l+1) continue;
  15. f[i][j]+=f[i-1][j-l-1];
  16. if(j<l+2) continue;
  17. f[i][j]+=f[i-1][j-l-2];
  18. if(j<l+3) continue;
  19. f[i][j]+=f[i-1][j-l-3];
  20. if(j<l+4) continue;
  21. f[i][j]+=f[i-1][j-l-4];
  22. if(j<l+5) continue;
  23. f[i][j]+=f[i-1][j-l-5];
  24. if(j<l+6) continue;
  25. f[i][j]+=f[i-1][j-l-6];
  26. if(j<l+7) continue;
  27. f[i][j]+=f[i-1][j-l-7];
  28. }
  29. for(l;l<i;l++){
  30. if(j<l) continue;
  31. f[i][j]+=f[i-1][j-l];
  32. }
  33. f[i][j]%=10000;
  34. }
  35. }
  36. printf("%d",f[n][k]);
  37. return 0;
  38. }

正解是前缀和优化,每次更新都是加一段连续区间的值,可以用前缀和降复杂度。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int MAXN=1005;
  5. const int MOD=10000;
  6. int dp[MAXN][MAXN];
  7. int n,k,ans,sum;
  8. int main()
  9. {
  10. scanf("%d%d",&n,&k);
  11. for(int i=1;i<=n;i++) dp[i][0]=1;
  12. for(int i=2;i<=n;i++)
  13. {
  14. sum=0;
  15. for(int j=0;j<=k;j++)
  16. {
  17. (sum+=dp[i-1][j])%MOD;
  18. dp[i][j]=sum%MOD;
  19. if(j-i+1>=0)((sum-=dp[i-1][j-i+1])+=MOD)%MOD;
  20. }
  21. }
  22. printf("%d\n",dp[n][k]);
  23. return 0;
  24. }

[BZOJ] 2431 逆序对数列的更多相关文章

  1. BZOJ 2431 逆序对数列 DP

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...

  2. BZOJ 2431: [HAOI2009]逆序对数列( dp )

    dp(i,j)表示1~i的全部排列中逆序对数为j的个数. 从1~i-1的全部排列中加入i, 那么可以产生的逆序对数为0~i-1, 所以 dp(i,j) = Σ dp(i-1,k) (j-i+1 ≤ k ...

  3. 2431: [HAOI2009]逆序对数列

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 954  Solved: 548[Submit][Status ...

  4. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, ...

  5. bzoj2431:[HAOI2009]逆序对数列

    单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...

  6. bzoj2431: [HAOI2009]逆序对数列(前缀和优化dp)

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2312  Solved: 1330[Submit][Stat ...

  7. 【BZOJ2431】逆序对数列(动态规划)

    [BZOJ2431]逆序对数列(动态规划) 题面 Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组 ...

  8. P2513 [HAOI2009]逆序对数列

    P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那 ...

  9. BZOJ2431 HAOI2009 逆序对数列 【DP】*

    BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai​,如果有i<j且ai>aja_i>a_jai​>aj​,那么我们称aia ...

随机推荐

  1. Java多线程系列七——ExecutorService

    java.util.concurrent.ExecutorService接口提供了许多线程管理的方法 Method 说明 shutdown 拒绝接收新的任务,待已提交的任务执行后关闭,且宿主线程不阻塞 ...

  2. sql server 日期模糊查询

    转换成varchar类型 ) like '%2010-10-09%' 两个字段拼接成一个字段 SELECT C0252_ID, C0252_name,C0252_Addr, ((select top ...

  3. 超强XSS攻击利器

    ======================================================================= BackTrack 5 R1 XSS研究之XSSer(超 ...

  4. RelativeLayout和layout_weight的异曲同工之妙(转载)

    转自:http://ericbaner.iteye.com/blog/1161751 Android应用UI开发,对以上布局,可以使用RelativeLayout, 即: Xml代码 <Rela ...

  5. patch用法 (转载)

    转载:http://shenze60.blog.163.com/blog/static/315747722009724113026896/ 首先介绍一下diff和patch.在这里不会把man在线文档 ...

  6. E20180305-hm-xa

    raw adj. 生的,未加工的; 无经验的; 新近完成的; 发炎的,疼痛的; payload n. 有效载荷; (航天器.卫星的) 装备; (车辆等的) 装载货物; (炸弹.导弹的) 爆炸力;

  7. 小程序 获取地理位置-- wx.getLocation

    话不多说直接上栗子 //首先声明变量data:{ showLocationAuth:fasle } //这是第一种逻辑实现方式 点击按钮//当第一次点击授权按钮,用户取消授权之后,就会显示 授权当前定 ...

  8. ROS学习笔记七:在ROS中使用USB摄像头

    下面是一些USB摄像头的驱动(大多数摄像头都支持uvc标准): 1 使用软件库里的uvc-camera功能包 1.1 检查摄像头 lsusb ----------------------------- ...

  9. 转-UIButton定义和设置圆角

    //login button // .h 中定义 UIButton *_loginBtn; @property (strong,nonatomic)UIButton *loginBtn; // .m ...

  10. 用vue写的移动端车牌号输入法

    效果图: (录制了视频演示,然而不会上传.....心塞.....) 本页面所在项目已上传GitHub,github下载地址:https://github.com/dan-Zd/car-vueapp  ...