poj 2411 Mondriaan's Dream 【dp】
题目: id=2411" target="_blank">poj 2411 Mondriaan's Dream
题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案。
分析:这是一个比較经典的题目。网上各种牛B写法一大堆。题解也是
我们能够定义状态:dp【i】【st】:在第 i 行状态为 st 的时候的最慷慨案数、
然后转移方程:dp【i】【st】 = sum (dp【i-1】【ss】)
即全部的当前行都是由上一行合法的状态转移而来。
而状态的合法性由两种铺法得到。第一种横放。注意要求前一行全满。然后竖放,上一行为空。能够留空。
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const long long N = 15;
long long dp[N][1<<N];
long long ans[N][N];
long long n,m;
bool solve(long long st)
{
long long tmp=0;
for(long long i=0; i<m; i++)
{
if(st&(1<<i))
tmp++;
else
{
if(tmp%2)
return false;
tmp=0;
}
}
if(tmp%2)
return false;
return true;
}
bool cmp(long long st,long long up)
{
for(long long i=0; i<m; i++)
{
if(st&(1<<i))
{
if(up&(1<<i))
{
if(i==m-1 || !(st&(1<<(i+1))) || !(up&(1<<(i+1))))
return false;
else
i++;
}//否则的话竖放
}
else
{
if(!(up&(1<<i)))
return false;
}
}
return true;
}
int main()
{
memset(ans,0,sizeof(ans));
while(~scanf("%lld%lld",&n,&m))
{
if(n==0 && m==0)
break;
if((m*n)%2)
{
printf("0\n");
continue;
}
if(m>n)
swap(m,n);
if(ans[n][m])
{
printf("%lld\n",ans[n][m]);
continue;
}
memset(dp,0,sizeof(dp));
long long len = 1<<m;
for(long long i=0; i<len; i++)
{
if(solve(i))
dp[1][i]=1;
}
for(long long i=2; i<=n; i++)
{
for(long long st=0; st<len; st++) //当前行
{
for(long long k = 0; k<len; k++) //上一行
{
if(cmp(st,k))
dp[i][st]+=dp[i-1][k];
}
}
}
printf("%lld\n",dp[n][len-1]);
ans[n][m] = dp[n][len-1];
}
return 0;
}
poj 2411 Mondriaan's Dream 【dp】的更多相关文章
- POJ 2411 Mondriaan's Dream (dp + 减少国家)
链接:http://poj.org/problem?id=2411 题意:题目描写叙述:用1*2 的矩形通过组合拼成大矩形.求拼成指定的大矩形有几种拼法. 參考博客:http://blog.csdn. ...
- POJ 2411 Mondriaan's Dream
状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...
- POJ 2411 Mondriaan'sDream(状压DP)
题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...
- poj 2411 Mondriaan's Dream_状态压缩dp
题意:给我们1*2的骨牌,问我们一个n*m的棋盘有多少种放满的方案. 思路: 状态压缩不懂看,http://blog.csdn.net/neng18/article/details/18425765 ...
- 状压DP POJ 2411 Mondriaan'sDream
题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- redhat6.3 64位更新源(使用网易源)全过程记录
本篇博客参考:http://chinaxiaoyu.diandian.com/post/2013-01-24/40046529897.首先在浏览器中输入http://tel.mirrors.163.c ...
- cocos2dx lua 学习笔记(二)
安装开发环境 sublime - http://www.sublimetext.com/2 package control - http://packagecontrol.io/installatio ...
- Unity 编辑器扩展自定义窗体
这次看见Unity还可以自定义弹出窗体,让我很好奇.于是就去网上找文章看了看. 如果想自定义窗体需要把类放入Editor文件夹下面. 代码如下: using UnityEngine; using Un ...
- Ubuntu 系统搭建php服务器 用ssh 远程操作
一:在桌面下载xshell客户端连接 ,vmavar 上的 Ubuntu系统,遇到的问题跟大家分享一下,希望大家少走弯路 Ubuntu系统默认没有ssh server 要安装 apt-get inst ...
- Web安全技术(3)-浏览器的跨域访问
http://www.blogjava.net/linli/archive/2015/04/22/424584.html 一.浏览器介绍 对于Web应用来说,浏览器是最重要的客户端. 目前浏览器五花八 ...
- mysql5.7 二进制包安装
1. 下载包 wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz 2. 解 ...
- jeasyui制作计划-ajax学习
Ajax:可以无刷新状态更新页面,并且实现异步提交,提升了用户的体验. 1.load()函数的使用,可以三个参数:url(必须的参数,请求html文件的url地址,参数类型string).date(可 ...
- 为什么所有浏览器的userAgent都带Mozilla
参看下面链接:<为什么所有的浏览器的userAgent都带Mozilla>
- win7+IE11 中开发工具报错occurredJSLugin.3005解决办法
系统环境 win7+IE11 报错描述: Exception in window.onload: Error: An error has ocurredJSPlugin.3005 Stack Trac ...
- js scroll 教程
<html><head><script language=javascript>function s(){var c = window.document.body. ...