BZOJ 2431 & DP
题意:求逆序对数量为k的长度为n的排列的个数
SOL:
显然我们可以对最后一位数字进行讨论,判断其已经产生多少逆序对数量,然后对于前n-1位同样考虑---->每一个长度的排列我们都可以看做是相同的,因为它与最后一位的影响我们已经计算过了.那么就变成了一个好多维DP的过程...
不过我的方程感觉有点太直白,应该可以优化因为在BZ上都是卡时过去的...太慢了...大概状态还是有问题....
Code:
/*================================================================= # Created time: 2016-03-30 19:36 # Filename: 2431.cpp # Description: =================================================================*/ #define me AcrossTheSky #include <cstdio> #include <cmath> #include <ctime> #include <string> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <set> #include <map> #include <stack> #include <queue> #include <vector> #define lowbit(x) (x)&(-x) #define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++) #define FORP(i,a,b) for(int i=(a);i<=(b);i++) #define FORM(i,a,b) for(int i=(a);i>=(b);i--) #define ls(a,b) (((a)+(b)) << 1) #define rs(a,b) (((a)+(b)) >> 1) #define getlc(a) ch[(a)][0] #define getrc(a) ch[(a)][1] #define mod 10000 #define maxn 1100 #define maxk 1010 #define maxm 100000 #define pi 3.1415926535898 #define _e 2.718281828459 #define INF 1070000000 using namespace std; typedef long long ll; typedef unsigned long long ull; template<class T> inline void read(T& num) { bool start=false,neg=false; char c; num=0; while((c=getchar())!=EOF) { if(c=='-') start=neg=true; else if(c>='0' && c<='9') { start=true; num=num*10+c-'0'; } else if(start) break; } if(neg) num=-num; } /*==================split line==================*/ int f[maxn][maxk]; int main(){ int n,k; read(n); read(k); memset(f,0,sizeof(f)); f[1][0]=1; FORP(i,1,n) FORP(j,1,i) { int t=i-j; FORP(l,0,k-t) f[i][l+t]+=f[i-1][l],f[i][l+t]%=mod; } printf("%d\n",f[n][k]); }
Sometimes it s the very people who no one imagines anything of. who do the things that no one can imagine.