Bzoj-2431 逆序对数列(DP+前缀和优化)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bzoj-2431 逆序对数列(DP+前缀和优化)相关的知识,希望对你有一定的参考价值。
这道题的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 }
以上是关于Bzoj-2431 逆序对数列(DP+前缀和优化)的主要内容,如果未能解决你的问题,请参考以下文章