POJ 2411 Mondriaan's Dream
来源:互联网 发布:免费seo软件 编辑:程序博客网 时间:2024/05/17 06:28
基本思想是基于状态压缩的动态规划。
按照每一行顺序放置,由于方块的形状限制,每一行的放置情形只跟上一行有关,而跟这之前的无关,这就为采用动态规划算法提供了依据。
可分三种情况来单独讨论:
①当前位置不放置方块。则上一行的相应位置必须填充方块,否则以后都不可能填充。
②当前位置竖放方块。上一行相应位置必须为空,否则就会产生方块的重叠。
③当前位置横放方块。上一行相应位置必须填充方块
第一行比较特殊,它的上一行可以认为是已经填满的,需要单独来计算。
整个算法可以结合递归来实现。
#include <vector>#include <list>#include <limits.h>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>#include <string.h>#include <stdlib.h>using namespace std;int row, col;long long dp[12][1<<12];void dfs_fir(int c, int state);void dfs(int r, int c, int cur, int pre);int main(){ while(cin>>row>>col){ if(row==0 && col==0) break; memset(dp, 0, sizeof(dp)); dfs_fir(0, 0); for(int i=1; i<row; i++) dfs(i, 0, 0, 0); cout<<dp[row-1][(1<<col)-1]<<endl; }// end while loopreturn 0;}void dfs_fir(int c, int state){ if(c > col) return; if(c==col){ ++dp[0][state]; return; } dfs_fir(c+1, state<<1); dfs_fir(c+2, (state<<2)|3); return;}// end method dfs_firvoid dfs(int r, int c, int cur, int pre){ if(c > col) return; if(c == col){ dp[r][cur] += dp[r-1][pre]; return; } // place vertically dfs(r, c+1, (cur<<1)|1, pre<<1); // place horizontally dfs(r, c+2, (cur<<2)|3, (pre<<2)|3); // not place dfs(r, c+1, cur<<1, (pre<<1)|1); return;}// end method dfs
0 0
- POJ 2411 Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- POJ 2411: Mondriaan's Dream
- POJ 2411 Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream
- POJ-2411-Mondriaan's Dream
- poj 2411 Mondriaan's Dream
- POJ 2411 Mondriaan's Dream
- Android 音乐播放器的实现(二)界面的实现
- MySql计算两个日期的时间差函数
- apache+tomcat集群处理
- User-agent 类型汇总
- linux下程序烧写(dnw+minicom)
- POJ 2411 Mondriaan's Dream
- 玩转Web之servlet(一)---怎样创建一个servlet
- 理财:互联网金融货币基金
- 居然没找到空间域名在哪里设置??
- 2002
- viewpager实现画廊(一屏多个Fragment)效果
- js中escape,encodeURI,encodeURIComponent三个函数的区别
- thinkphp 添加数据 使用add($data); 只有主键增长 其他都为空
- 下拉选项