有两个1~n 的排列A,B, B是1,2,3...n, 给出A每个数位置变化(往后,往前,不变)
问A排列数?
观察以下发现是个二分图匹配的模型,考虑dp
f[i ][ j] 考虑前i个,有j个未匹配
#include <iostream> #include <cstring> using namespace std ; const int N=1003; const int mod=1e9+7; #define int long long int n,f[N][N]; char op[N]; void solve(int cas){ int i,j; n =strlen(op+1); memset(f,0,sizeof f); f[0][0]=1; for(i=1;i<=n;i++){ for(j=0;j<=i;j++){ if(op[i]=='U') f[i][j]= f[i-1][j-1]+ (f[i-1][j]*j)%mod, f[i][j]%=mod; if(op[i]=='D') f[i][j]=((f[i-1][j+1]*(j+1))%mod*(j+1))%mod +(f[i-1][j]*j)%mod, f[i][j]%=mod; if(op[i]=='E') f[i][j]=f[i-1][j]%mod; } } printf("Case %d: %d\n",cas,f[n][0]); } signed main(){ int tes;cin>>tes;int cas=0; while(tes--){ cin>>(op+1);solve(++cas); } }