SGU131 状态压缩~覆盖方案数
来源:互联网 发布:表达爱意的网络用语 编辑:程序博客网 时间:2024/06/10 13:25
做这个题前前后后磨了3天,感觉自己弱爆了;总算理解好了,不过收获也很大,发现之前状态理解错了,做这个题的时候,发现论文里面的状态转移完全无法理解,然后去找各种解题报告,让我恍然大悟的一句话是:“因为已经做到了第i行,那么i-1行一定要求是满的。”,这是在Wrongswer空间看到的一句话,对于dfs中pre,now状态转换顿时就明白了。而且这个解题报告状态的解释也很清楚,值得一看。为了加深自己的理解,就写了个反状态的压缩,dfs的时候思考清楚就好了,预处理做好了接下来的就跟之前的题目一样一样了。还有一点,题目空间给的小,存储状态的数组不要开太大,否则会MEL。
ACcode:
#include<cstdio>#include<cstring>typedef long long LL;const int NS=79248;const int LIM=1<<9;LL dp[2][LIM];int state[NS][2],top;void dfs(int pre,int now,int pf,int nf,int pos){ if (pos==0) { if (pf&&nf) state[top][0]=pre, state[top++][1]=now; return ; } dfs((pre<<1|1)-pf,(now<<1)+nf,1,1,pos-1); //不放 if (pf&&nf) dfs(pre<<1|1,now<<1,1,1,pos-1), //竖直放 dfs(pre<<1|1,now<<1,0,1,pos-1), //缺右下 dfs(pre<<1|1,now<<1,1,0,pos-1); //缺右上 if (nf) dfs((pre<<1|1)-pf,now<<1,0,0,pos-1); //缺左上 if (pf) dfs(pre<<1|1,(now<<1)+nf,0,1,pos-1), //横放 dfs(pre<<1|1,(now<<1)+nf,0,0,pos-1); //缺左下}void init(int x){ for (int i=0; i<LIM; i++) dp[x][i]=0;}void print(int x,int y){ for (int i=0; i<y; i++) printf("%d",(x>>i)&1);}int main(){ int n,m,p,q,s; while (~scanf("%d %d",&n,&m)) { init(0),top=s=0; if (n<m) n^=m,m^=n,n^=m; dp[0][(1<<m)-1]=1,dfs(0,0,1,1,m); for (int i=0; i<n; i++) { s^=1,init(s); for (int j=0; j<top; j++) p=state[j][0],q=state[j][1], dp[s][q]+=dp[s^1][p]; } printf("%I64d\n",dp[s][(1<<m)-1]); } return 0;}
- SGU131 状态压缩~覆盖方案数
- poj2411 状态压缩~方案数
- hdu3006 状态压缩~方案数
- hdu3091 状态压缩~方案数
- 状态压缩棋盘问题2道 sgu131&poj1038
- hdu 4529 状态压缩~方案数
- sgu 223 状态压缩+方案数
- poj2441 状态压缩~放置方案数
- poj 2288 状态压缩~最优值+方案数
- Poj 3254 Corn Fields 状态压缩(方案数)
- Poj 2411 Mondriaan's Dream 状态压缩(方案数)
- poj2836 状态压缩~矩形覆盖
- sgu131
- sgu131
- sgu131
- poj3254 棋盘覆盖~方案数
- poj 1038 状态压缩~棋盘覆盖
- 状态压缩-覆盖问题-poj 2411 2663
- ScriptCase的多语言支持
- 关于jdk与jre的区别
- 使用svn diff的-r参数的来比较任意两个版本的差异
- thinkphp文件上传所需参数
- 写给自己
- SGU131 状态压缩~覆盖方案数
- HDU1455(DFS)
- Ajax版省市三联动(源码)
- Spring使用注解的方式实现AOP
- widger处理点击事件
- Linux 查看进程和删除进程
- JSP中防止重复提交(Javascript)
- 什么是阅读?
- Extjs4 重写Ext.data.TreeStore的load方法,不使多次加载