Bzoj-2431 逆序對數列(DP+前綴和優化)
阿新 • • 發佈:2017-10-10
string 開始 div include main () 生成 enter while
這道題的dp式子很好推
dp[i][j]表示1~n的排列中生成的逆序對數為k的序列的個數
則有dp[i][j]=∑dp[i-1][0~j-1](j<=k)
這個式子顯然可以用前綴和優化一下,不用每次都花O(n)的時間去算這個和--太浪費!!!
一開始這個前綴和還搞炸了qwq...
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<iostream> 5 #include<vector> 6 #include<map> 7View Code#include<queue> 8 #include<algorithm> 9 using namespace std; 10 #define maxn 1005 11 #define mod 10000 12 #define ll long long 13 void read(int &x){ 14 x=0;int f=1;char ch=getchar(); 15 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 16 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 17 x*=f; 18 } 19 int f[maxn][maxn],sum[maxn];//n個數m個逆序對的方案 20 inline void M(int &x){x=x>10000?x-10000:x;} 21 int n,k,ans; 22 int main(){ 23 read(n);read(k);f[0][0]=1; 24 for(int i=1;i<=n;i++) 25 for(int j=0;j<=k;j++){ 26 M(sum[j]=(j?sum[j-1]:0)+f[i-1][j]); 27 M(f[i][j]=sum[j]-sum[j-i]+mod); 28 } 29 printf("%d",f[n][k]); 30 }
Bzoj-2431 逆序對數列(DP+前綴和優化)