传送门

目前只会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. 8.tomcat认证访问

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 接上例:namespce的作用除了在前面提到的避免协同开发名字冲突外,还为认 ...

  2. AS3获取对象类名,getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName

    首先先告诉大家,我要讲的是flash.utils包中的getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName可能帮助文 ...

  3. EF时间模糊查询

    public List<Vote> SelectVoteByTime(string time) { return db.Vote.ToList().Where(x => x.V_Be ...

  4. C++Primer笔记-----day08

    ==========================================================================day08===================== ...

  5. dapper.net 转载

    Dapper.NET——轻量ORM   Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2 ...

  6. Inteiilj IDEA 团队代码格式规范

    目录 Intellij IDEA code format Tabs and Indents Spaces Wrapping and Braces Imports 更新 Intellij IDEA co ...

  7. delphi常用函数和方法

     uses ShellApi, ActiveX, ComObj, ShlObj; function HasText(Text: string; const Values: array of strin ...

  8. 必备 .NET - C# 脚本

    作者:Mark Michaelis | 2016 年 1 月 Link: https://msdn.microsoft.com/zh-cn/magazine/mt614271.aspx 随着 Visu ...

  9. PowerDesigner表生成 EXCEL

    今天收到一个需求,要把数据库设计给一个excel版本的,百度出来一个脚本文件,很好用发现,留个纪念 在pd中,shift+ctrl+X,打开脚本运行,脚本如下,附件也留了一份: '********** ...

  10. 基元线程同步构造之waithandle中 waitone使用

    在使用基元线程同步构造中waithandle中waitone方法的讲解: 调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 Wait ...