1. 程式人生 > >Bzoj-2431 逆序對數列(DP+前綴和優化)

Bzoj-2431 逆序對數列(DP+前綴和優化)

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>
 7
#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 }
View Code

Bzoj-2431 逆序對數列(DP+前綴和優化)