有两个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);
 	}
 }

 

 

posted on 2023-04-15 02:01  towboat  阅读(29)  评论(0)    收藏  举报