标签:中国 lld pid 个数 情况 空格 time soc color
除了在3个格子中都放满炮的的情况外,其它的都可以.
100%的数据中N,M不超过100
50%的数据中,N,M至少有一个数不超过8
30%的数据中,N,M均不超过6
看起来很像状压DP的套路是不是?然而只是个很水的比较基础的DP。
满足要求的方法:每行每列棋子数不超过2,就有6种放法。
(1) 不放;(2) 放一个棋子,在之前没有棋子的一列;(3) 放一个棋子,在之前有棋子的一列;(4) 放两个棋子,在之前没有棋子的两列;(5) 放两个棋子,在之前没有棋子的一列和在之前有棋子的一列;(6) 放两个棋子,在之前有棋子的两列。
f[i][j][k]表示前i行,有j列是一个棋子,有k列是两个棋子的方案数,答案如左下
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 const int mod=9999973; 6 using namespace std; 7 int n,m; 8 long long ans; 9 long long f[110][110][110]; 10 int main(){ 11 scanf("%d%d",&n,&m); 12 memset(f,0,sizeof(f)); 13 f[0][0][0]=1; 14 for(int i=1;i<=n;i++) 15 for(int j=0;j<=m;j++) 16 for(int k=0;k<=m-j;k++){ 17 f[i][j][k]=f[i-1][j][k]; 18 if(j>=1) f[i][j][k]=(f[i][j][k]+f[i-1][j-1][k]*(m-j-k+1))%mod; 19 if(k>=1) f[i][j][k]=(f[i][j][k]+f[i-1][j+1][k-1]*(j+1))%mod; 20 if(j>=2) f[i][j][k]=(f[i][j][k]+f[i-1][j-2][k]*(m-j-k+2)*(m-j-k+1)/2)%mod; 21 if(k>=2) f[i][j][k]=(f[i][j][k]+f[i-1][j+2][k-2]*(j+2)*(j+1)/2)%mod; 22 if(j>=1&&k>=1) f[i][j][k]=(f[i][j][k]+f[i-1][j][k-1]*(m-j-k+1)*j)%mod; 23 } 24 for(int i=0;i<=m;i++) 25 for(int j=0;j<=m-i;j++) ans=(ans+f[n][i][j])%mod; 26 printf("%lld\n",ans); 27 }
动态规划 BZOJ1801 [Ahoi2009]chess 中国象棋
标签:中国 lld pid 个数 情况 空格 time soc color
原文地址:http://www.cnblogs.com/sdfzxh/p/7259928.html