luogu P2513 [HAOI2009]逆序對數列
阿新 • • 發佈:2018-12-09
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]()
*/