已经没办法再简单的状压dp入门练习
来源:互联网 发布:js点击事件隐藏 编辑:程序博客网 时间:2024/06/07 20:39
题目:
有一个N*M(N<=5,M<=1000)的棋盘,现在有1*2及2*1的小木块无数个,要盖满整个棋盘,有多少种方式?答案只需要mod1,000,000,007即可。
例如:对于一个2*2的棋盘,有两种方法,一种是使用2个1*2的,一种是使用2个2*1的。
分析:此题由于N比较小,所以可以通过状态压缩,去搜索每一个状态,然后根据前一列对后一列的影响,这样我们只要求出第m+1列状态为0的情况的个数,就是正解
accode:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>using namespace std;typedef long long ll;const double PI = acos(-1.0);const double eps = 1e-6;const int INF = 0x3f3f3f3f;const int maxn = 100;const int mod = 1e9 + 7;int T, n, m;ll dp[1005][(1 << 5) + 5];void dfs(int i, int j, int state, int nex) { if (j == n) { dp[i + 1][nex] += dp[i][state]; //cout << i + 1 << " " << nex << " " << dp[i + 1][nex]<<endl; dp[i + 1][nex] = dp[i + 1][nex] % mod; return; } if ((state&(1 << (j))) >0) { dfs(i, j + 1, state, nex); } if ((state&(1 << (j))) == 0) { dfs(i, j + 1, state, (nex | (1 << (j)))); } if ((state&(1 << (j))) == 0 && (j + 1<n) && ((state&(1 <<( j + 1))) == 0)) { dfs(i, j + 2, state, nex); }}int main(){ memset(dp, 0, sizeof(dp)); scanf("%d%d", &n, &m); dp[1][0] = 1; //int t = (3 & (1 << (1))); //cout <<t << endl; for (int i = 1; i <= m; i++) { for (int j = 0; j <(1 << (n)); j++) { dfs(i, 0, j, 0); } } cout << dp[m + 1][0] << endl; return 0;}
阅读全文
0 0
- 已经没办法再简单的状压dp入门练习
- 简单的数位dp练习
- 一些以前没做的简单DP
- jQuery的简单入门练习
- 练习英语口语的办法
- vb6判断动态字节数组是否已经初始化的最简单的办法
- 没办法。。。
- 没办法
- 没办法
- 没办法
- 没办法
- 没办法
- 【算法入门】简单练习
- 心情好,真是没办法的事!
- 没办法还是锁机制的讲解
- 笨办法学 Python · 续 练习 36:简单的计算器
- Day 13 入门简单练习
- DP 入门提练习解题报告
- 如何搭建SSH框架,myeclipse搭建SSH框架详解
- Qt中tr()函数 国际化 乱码
- 抓包工具Fiddler使用(主要用于监听APP对外访问请求)
- Linux 的一些帮助网站
- 合并区间
- 已经没办法再简单的状压dp入门练习
- 整数排序2
- PhpStorm10.0快捷键大全 PhpStorm10.0常用快捷键和配置
- 2017年4月美团Android面试总结
- 个人笔记(第八篇)关于缓存数据(比如用来判断是否登录)
- Arcgis js featureLayer加载完成之后,对其加载的要素重新定义样式
- URI URL区别
- 整数排序
- MySql删除重复数据