有两个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);
}
}
浙公网安备 33010602011771号