zoukankan      html  css  js  c++  java
  • [bzoj2431][HAOI2009][逆序对数列] (dp计数)

    Description

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

    Input

    第一行为两个整数n,k。

    Output

    写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果。

    Sample Input

    4 1

    Sample Output

    3

    样例说明:
    下列3个数列逆序对数都为1;分别是1 2 4 3 ;1 3 2 4 ;2 1 3 4;
    100%的数据 n<=1000,k<=1000

    Solution

    为了满足无后效性要求,我们从小到大插入数字

    设f[i][j]为放置好数字[1,i-1]后考虑放i并总共得到j对逆序对的数列数量

    那么f[i][j]=sum(f[i-1][k]); (k∈[j-i+1,j])

    #include <stdio.h>
    #define mo 10000
    int n,k,f[1001][1001],s[1001][1001];
    int main(){
        scanf("%d%d",&n,&k);
        f[1][0]=1;
        for(int i=0;i<=k;i++)
            s[1][i]=1;
        for(int i=2;i<=n;i++){
            for(int j=0;j<=k;j++){
                f[i][j]=s[i-1][j];
                if(j-i>=0)f[i][j]-=s[i-1][j-i];
                f[i][j]=(f[i][j]+mo)%mo;
            }
            s[i][0]=1;
            for(int j=1;j<=k;j++)
                s[i][j]=(s[i][j-1]+f[i][j])%mo;
        }
        printf("%d
    ",f[n][k]);
        return 0;
    }
  • 相关阅读:
    杰我教育-新老学员交流会
    来杰我学IT,好就业
    怎么创建maven项目
    项目开发生命周期
    2015年12月28日,我工作了
    SSH架构图及各部分知识点
    jsp基础大全
    网站创建过程(二)
    网站创建过程(一)
    python+Django+mysql环境搭建
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6345033.html
Copyright © 2011-2022 走看看