传送门

目前只会n2" role="presentation" style="position: relative;">n2n2的dp" role="presentation" style="position: relative;">dpdp做法。

设dp[i][j]" role="presentation" style="position: relative;">dp[i][j]dp[i][j]表示1" role="presentation" style="position: relative;">11~i" role="presentation" style="position: relative;">ii的排列逆序对为j" role="presentation" style="position: relative;">jj的方案数。显然这个东西是可以递推的。相当于将i" role="presentation" style="position: relative;">ii插入到1" role="presentation" style="position: relative;">11~i−1" role="presentation" style="position: relative;">i−1i−1的排列中,然后就可以从dp[i−1][k]" role="presentation" style="position: relative;">dp[i−1][k]dp[i−1][k]转移过来。

然后我们就惊奇的发现这个方法是O(n3)" role="presentation" style="position: relative;">O(n3)O(n3)的,显然会T" role="presentation" style="position: relative;">TT掉。

如何优化?

仔细观察会发现,dp[i][j]" role="presentation" style="position: relative;">dp[i][j]dp[i][j]是由dp[i−1]" role="presentation" style="position: relative;">dp[i−1]dp[i−1]的前缀和转移过来的,因此每次枚举i" role="presentation" style="position: relative;">ii之后,我们维护一个叫做sum" role="presentation" style="position: relative;">sumsum的东西来表示dp[i−1]" role="presentation" style="position: relative;">dp[i−1]dp[i−1]的前缀和然后就能O(n2)" role="presentation" style="position: relative;">O(n2)O(n2)转移了。

代码如下:

#include<bits/stdc++.h>
#define N 1005
#define mod 10000
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans;
}
int dp[N][N],ans=0,n,k;
int main(){
    n=read(),k=read();
    memset(dp,0,sizeof(dp));
    dp[1][0]=1;
    for(int i=2;i<=n;++i){
        ans=0;
        for(int j=0;j<=k;++j){
            ans=(ans+dp[i-1][j])%mod;
            dp[i][j]=ans%mod;
            if(j+1-i>=0)ans=(ans-dp[i-1][j-i+1]+mod)%mod;
        }
    }

    printf("%d",dp[n][k]);
    return 0;
}

2018.07.18 HAOI2009 逆序对数列(线性dp)的更多相关文章

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

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

  2. BZOJ 2431: [HAOI2009]逆序对数列【dp】

    Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序 ...

  3. 【BZOJ 2431】 [HAOI2009] 逆序对数列 (DP)

    Description 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数 ...

  4. [luogu2513 HAOI2009] 逆序对数列 (计数dp)

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

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

    f[i][j]前i个数有j个逆序对的数量 f[i][j]=sigma(f[i-1][j-k]){1<=k<=i} 维护一个前缀和即可 #include<iostream> #i ...

  6. 【洛谷 P2513】 [HAOI2009]逆序对数列(DP)

    题目链接 这种求方案数的题一般都是\(dp\)吧. 注意到范围里\(k\)和\(n\)的范围一样大,\(k\)是完全可以更大的,到\(n\)的平方级别,所以这暗示了我们要把\(k\)写到状态里. \( ...

  7. BZOJ 2431 [HAOI2009]逆序对数列:dp 逆序对

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2431 题意: 给定n,k,问你有多少个由1~n组成的排列,使得逆序对个数恰好为k个. 题解 ...

  8. [luoguP2513] [HAOI2009]逆序对数列(DP)

    传送门 f[i][j]表示前i个数,逆序对数为j的答案 则DP方程为: f[1][0] = 1; for(i = 2; i <= n; i++) for(j = 0; j <= m; j+ ...

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

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

随机推荐

  1. Activity服务类-7 RepositoryService服务类

    Activity服务类-1 RepositoryService服务类一共47个接口1.创建部署//开始创建一个新的部署.DeploymentBuilder createDeployment(); 2. ...

  2. Dictionary 字典的使用

    Dim a, d, i             '创建几个变量Set d = CreateObject("Scripting.Dictionary")d.Add "a&q ...

  3. 使用VB.Net Express版本创建服务

    Services Part 1:>  Creating Services Visual Basic Express is a great, free tool from Microsoft.   ...

  4. 16 python 异常处理

    1.了解什么是异常处理 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止), 在python中,错误触发的异常如下 2.了解 ...

  5. apiCloud上传头像

    apiCloud上传头像 1.拍照 2.从相机中选择 aui布局 <li class="aui-list-item"> <div class="aui- ...

  6. React 简单介绍

    React 简单介绍 作者 RK_CODER 关注 2014.12.10 17:37* 字数 2516 阅读 55715评论 6喜欢 70 why React? React是Facebook开发的一款 ...

  7. ubuntu16.04 dpkg强制安装 teamviewer

    dpkg遇到安装有依赖,而依赖的包有无法安装的时候,可以试试强制安装: .90154_amd64.deb 虽然报错,但是安装后还是可以使用. 如果使用: .90154_amd64.deb 提示下面错误 ...

  8. Haskell语言学习笔记(54)Data.Set

    Data.Set Prelude> import Data.Set as Set Prelude Set> :set -XOverloadedLists Construction Prel ...

  9. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...

  10. tensor flow 视频

    http://v.youku.com/v_show/id_XMTYxMjQ2NTYyNA==.html?spm=a2h1n.8251843.playList.5!19~5~A.siMjNW&f ...