[SGU220 Little Bishops]
2012-03-24 22:30
232 查看
[关键字]:动态规划
[题目大意]:在一个n*n的棋盘里放k个主教(象),问使它们不能互相攻击的摆放方案有多少种。
//==================================================================
[分析]:其实不难但我没想到。首先玩过象棋的都知道黑象是吃不到白格里的,反之亦然。所以只要枚举在白格里放i个*黑格里放k-i个累加就行了。但是如何求出来呢?如果把整个棋盘旋转45度主教的行走路线就不再是斜线而是直线!他们变成了车!然后可以动态规划之:f[i][j]=f[i-1][j]+f[i-1][j-1]*(t-(j-1))前i行放j个的方案数,t表示这一行有t各空格。
[代码]:
View Code
[题目大意]:在一个n*n的棋盘里放k个主教(象),问使它们不能互相攻击的摆放方案有多少种。
//==================================================================
[分析]:其实不难但我没想到。首先玩过象棋的都知道黑象是吃不到白格里的,反之亦然。所以只要枚举在白格里放i个*黑格里放k-i个累加就行了。但是如何求出来呢?如果把整个棋盘旋转45度主教的行走路线就不再是斜线而是直线!他们变成了车!然后可以动态规划之:f[i][j]=f[i-1][j]+f[i-1][j-1]*(t-(j-1))前i行放j个的方案数,t表示这一行有t各空格。
[代码]:
View Code
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int bl,wl,n,m; int black[110],white[110]; long long ans; long long fb[11][110],fw[11][110]; void Init() { scanf("%d%d",&n,&m); int i; for (i=1;i<n;i+=2) black[++bl]=black[++bl]=i; if (i==n) black[++bl]=n; for (i=2;i<n;i+=2) white[++wl]=white[++wl]=i; if (i==n) white[++wl]=n; // for (int i=1;i<=bl;++i) printf("%d\n",black[i]); // for (int i=1;i<=wl;++i) printf("%d\n",white[i]); } void Solve() { memset(fb,0,sizeof(fb)); for (int i=0;i<=bl;++i) fb[i][0]=1; //fb[0][0]=1; for (int i=1;i<=bl;++i) for (int j=1;j<=black[i];++j) { fb[i][j]=fb[i-1][j]+fb[i-1][j-1]*(black[i]-j+1); //printf("%d %d %I64d\n",i,j,fb[i][j]); } //printf("%I64d ********\n",fb[10][14]); memset(fw,0,sizeof(fw)); for (int i=0;i<=wl;++i) fw[i][0]=1; //fw[0][0]=1; for (int i=1;i<=wl;++i) for (int j=1;j<=white[i];++j) fw[i][j]=fw[i-1][j]+fw[i-1][j-1]*(white[i]-j+1); //printf("%I64d ********\n",fb[10][14]); ans=0; for (int i=0;i<=m;++i) { ans+=fb[bl][i]*fw[wl][m-i]; //cout<<ans<<endl; //printf("%d %d %I64d %I64d %I64d\n",bl,i,fb[bl][i],fw[wl][m-i],ans); } //printf("%d %d\n",n,m); printf("%I64d\n",ans); } int main() { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); Init(); Solve(); return 0; }
相关文章推荐
- SGU 220 Little Bishops(棋盘放象)
- SGU 220 Little Bishops(状压dp)
- sgu-220 Little Bishops
- varchar 值 '1,220,52转换为数据类型为 int 的列时发生语法错误
- [SGU 107]987654321 problem (数论)
- 【sgu】106 解题报告
- 卡特兰数——sgu130Circle
- sgu 156 特殊情况下的哈密顿路
- 高精度——sgu112
- SGU105
- SGU 112 a^b - b^a
- SGU 174 Wall
- SGU 107 987654321 problem
- SGU 122 The book 满足ore性质的哈密尔顿回路求法
- SGU 136 高斯消元法的特殊情况
- SGU 225 Little Knights
- SGU 298. King Berl VI
- sgu 176 Flow construction--有源汇 有上下界 最小流
- sgu——344(宽搜)
- N 皇后问题,sgu224