BZOJ2431: [HAOI2009]逆序对数列

DP
F[i][j] 表示当前i个元素j个逆序对的方案
然后用类似前缀和的方法更新

#include<cstdio>
#include<iostream>
using namespace std;

char c;
inline void read(int &a)
{
    a=0;do c=getchar();while(c<'0'||c>'9');
    while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();
}
int f[1001][1001],tp,n,k;
int i,j;
int main()
{
   read(n),read(k);
    for(i=1;i<=n;++i)
      f[i][0]=1;
    for(i=2,tp=1;i<=n;++i,tp=1)
        for(j=1;j<=k;++j)
        {
            if(j-i>=0)tp-=f[i-1][j-i];
            tp+=f[i-1][j];
            f[i][j]=(tp+10000)%10000;
        } 
    printf("%d\n",f[n][k]);
    return 0;
}

你可能感兴趣的:(BZOJ2431: [HAOI2009]逆序对数列)