[CodeWaySky 1008]诸侯安置
题目大意:在N阶十字中放K个“车”,互不干扰的方案总数。输出MOD 504的结果,镜面和旋转算作不同方案。(十字图见下)一个三阶十字图
题目链接:http://codewaysky.sinaapp.com/problem.php?id=1008
题解-来自NOI导刊:
类似打砖块的巧妙DP,将图形倒腾倒腾
然后就随便搞了
#include<cstdio>
#define min(a,b) a<b?a:b
int n,m,lim,i,j,k,dp[202][10001]={0},num[202];
int main(){
freopen("empire.in","r",stdin);
freopen("empire.out","w",stdout);
scanf("%d%d",&n,&m);
if(m==0){
printf("1\n");
return 0;
}
lim=n<<1;
for(i=j=1;i<lim;i+=2){
dp[i][0]=dp[i+1][0]=1;
num[i+1]=num[i]=i;
}
dp[1][1]=dp[2][1]=1;
for(i=3;i<lim;i++){
dp[i][1]=num[i];
for(j=min(num[i],m);j>1;j--){
for(k=j-1;k<i;k++){
dp[i][j]+=dp[k][j-1]*(num[i]-(j-1));
dp[i][j]%=504;
}
}
}
j=0;
for(i=m;i<lim;i++) j+=dp[i][m];
j%=504;
printf("%d\n",j);
return 0;
}