SGU 223 Little Kings (状压dp)

来源:互联网 发布:傲剑坐骑升级数据大全 编辑:程序博客网 时间:2024/04/28 15:48

题意:给出n*n的矩形,问放k个互不攻击的king的方案数。

思路:一行一行放,将会被攻击的格子用1表示,否则用0表示,由于攻击是相互的,因此只要保证自己不被攻击即可。然后就dfs枚举下方案数。。。在学校机房写的,只有Vc6.0,现在已经不会用了

 

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;const int maxn=11;typedef long long ll;ll dp[maxn][maxn*maxn][1<<10];int n,k;inline bool check(int s,int p){return !(s&(1<<p));}void dfs(int line,int p,int st,int snext,int cnt,ll val){if(p==n){dp[line+1][cnt][snext]+=val;return ;}dfs(line,p+1,st,snext,cnt,val);if(check(st,p)&&cnt<k){int state=1<<p;if(p>0) state|=1<<(p-1);if(p<n-1) state|=1<<(p+1);dfs(line,p+1,st|state,snext|state,cnt+1,val);}}int main(){while(cin>>n>>k){memset(dp,0,sizeof(dp));dp[0][0][0]=1;for(int i=0;i<n;++i)for(int j=0;j<=k;++j)for(int x=0;x<(1<<n);++x)if(dp[i][j][x]) dfs(i,0,x,0,j,dp[i][j][x]);ll ans=0;for(int y=0;y<(1<<n);++y)ans+=dp[n][k][y];//printf("%I64d\n",ans);cout<<ans<<endl;}return 0;}


 

0 0
原创粉丝点击