1. 程式人生 > >luogu P2513 [HAOI2009]逆序對數列

luogu P2513 [HAOI2009]逆序對數列

luogu P2513 [HAOI2009]逆序對數列
動態規劃
f[i][j]表示前i個數有j個逆序對的方案數
f[1][0]=1
然後80分

#include<bits/stdc++.h> 
using namespace std;
#define mod 10000
const int N=1005;
int n,m;
int f[N][N]={0};//f[i][j]表示前i個數逆序對j個的方案數 
int main(){
    scanf("%d%d",&n,&m); 
    f[0][0]=1;
    for(int i=0;i<n;i++){//列舉前幾個 
        for
(int j=0;j<=i;j++){//列舉多產生幾個逆序對 for(int k=0;k+j<=m;k++){//列舉逆序對個數 f[i+1][j+k]=(f[i+1][j+k]+f[i][k])%mod; } } } printf("%d\n",f[n][m]); return 0; }

接下來字首和優化
100分
std:

#include<bits/stdc++.h> 
using namespace std;
#define mod 10000
const
int N=1005; int n,m; int f[N][N]={0};//f[i][j]表示前i個數逆序對j個的方案數 int cnt=0; int main(){ scanf("%d%d",&n,&m); f[1][0]=1; for(int i=1;i<n;i++){//列舉前幾個 cnt=0; for(int j=0;j<=m;j++){//列舉多產生幾個逆序對 cnt=(cnt+f[i][j])%mod; f[i+1][j]=(f[i+1][j]+cnt)%mod; if
(j-i>=0){ ((cnt-=f[i][j-i])+=mod)%mod; } } } //printf("%d\n",f[2][1]); printf("%d\n",f[n][m]); return 0; } /* f[0][0]=1 f[1][0]=1 f[2][0]=1 f[2][1]=f[1][0] f[3][0]=1 f[3][1]=f[2][0]+f[2][1] f[i][j]=f[i-1][k]() */