bzoj1087: [SCOI2005]互不侵犯King(状态压缩+Dp)
2017-10-09 14:48
281 查看
题目传送门
好久之前学的状态压缩现在都差不多忘了。。
解法:
硬搞的话应该很难吧。
所以用状态压缩来优化一下咯。
因为一行最多才9个点。每个点要么没要么有。
那么每一行最多有2^9种状态。
用1表示有国王,用0表示没国王。
这样我们就可以用二进制来表示每一行的状态。
那么怎么判断每一行的状态合不合法呢?
每个国王左右都是不能有国王的。
也就是每个1左右都不能有1。
那么我把整个状态往左移一位,这样如果不合法的话就会出现在相同位置有1。
所以与一下就OK了。
然后怎么继承上一行状态呢。
其实也差不多。
也是左右移判断。
不细讲了没空啊。
好久之前学的状态压缩现在都差不多忘了。。
解法:
硬搞的话应该很难吧。
所以用状态压缩来优化一下咯。
因为一行最多才9个点。每个点要么没要么有。
那么每一行最多有2^9种状态。
用1表示有国王,用0表示没国王。
这样我们就可以用二进制来表示每一行的状态。
那么怎么判断每一行的状态合不合法呢?
每个国王左右都是不能有国王的。
也就是每个1左右都不能有1。
那么我把整个状态往左移一位,这样如果不合法的话就会出现在相同位置有1。
所以与一下就OK了。
然后怎么继承上一行状态呢。
其实也差不多。
也是左右移判断。
不细讲了没空啊。
#include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> #include<algorithm> using namespace std; typedef long long ll; int n,K; int t[610]; //t[i]表示i状态有多少个1 int len,s[610]; //s存有用的状态(合法) ll f[11][610][110]; //f[i][j][k]表示第i行填j状态,填完后前i行有k个国王有多少种方案 int main() { scanf("%d%d",&n,&K); for(int i=1;i<=600;i++) { int x=i;t[i]=0; while(x!=0) { if(x%2==1) t[i]++; //求i有多少个1 x/=2; } } len=0; int ss=1; for(int i=1;i<=n;i++) ss*=2; for(int i=0;i<=ss-1;i++) //0也是一个状态哦。 if((i&(i*2))==0) s[++len]=i; //记录一下有用状态 for(int i=1;i<=len;i++) f[1][s[i]][t[s[i]]]=1; for(int i=2;i<=n+1;i++) for(int j=1;j<=len;j++) for(int k=1;k<=len;k++) if((s[j]&s[k])==0&&((s[j]*2)&s[k])==0&&((s[k]*2)&s[j])==0) //判断自己yy不详解 for(int l=K;l>=t[s[j]];l--) f[i][s[j]][l]+=f[i-1][s[k]][l-t[s[j]]]; //状态继承自己yy不祥解 printf("%lld\n",f[n+1][0][K]); //最后输出n+1行不填一共K个国王。 //也就是前n行填了K个国王。 return 0; }
相关文章推荐
- BZOJ题目1087: [SCOI2005]互不侵犯King(状态压缩DP)
- BZOJ1087 [SCOI2005]互不侵犯King 状态压缩DP
- [BZOJ]1087: [SCOI2005]互不侵犯King 状态压缩DP
- 【状态压缩DP】BZOJ1087-[SCOI2005]互不侵犯King
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
- [BZOJ 1087][SCOI2005]互不侵犯King:状态压缩DP
- 【状态压缩DP】【BZOJ1087】【SCOI2005】互不侵犯king
- [BZOJ 1087][SCOI 2005] 互不侵犯King 状态压缩DP
- BZOJ 状态压缩dp 1087: [SCOI2005]互不侵犯King
- BZOJ 1087: [SCOI2005]互不侵犯King 状态压缩 题解
- BZOJ_P1087&Codevs_P2451 [SCOI2005]互不侵犯King(状态压缩DP)
- D 1087: [SCOI2005]互不侵犯King (状态压缩dp)
- 【BZOJ1087】【SCOI2005】互不侵犯King 状态压缩 动态规划 水题 都不用加特技
- [bzoj1087]: [SCOI2005]互不侵犯King(状压dp)
- BZOJ 1087: [SCOI2005]互不侵犯King( 状压dp )
- 【bzoj1087】[SCOI2005]互不侵犯King 状压DP
- 【BZOJ1087】【SCOI2005】互不侵犯King(状压dp)
- bzoj1087 [SCOI2005]互不侵犯King(状压dp)
- BZOJ 1087 SCOI2005 互不侵犯King 状压DP
- 【bzoj 1087】[SCOI2005]互不侵犯King 状压dp