关于“我读过很多书,到后来大部分都被我忘记了,那阅读的意义是什么?”的疑问,我看过最巧妙的一个回答:当我还是个孩子的时候,我吃过很多的食物,大部分已经一去不复返而且被我忘记了,但可以肯定的是,它们中的一部分已经成长为我的骨头和肉。阅读对你的思想的改变也是如此。


填充的方法:

每個點三種情況,

1)是一個豎著的1*2的長方形的上半部分,對下一行限制是必須補全該長方形,用二進制1來表示

2)是一個豎著的1*2的長方形的下半部分,對下一行無限制,用0表示

3)是一個橫著的1*2的長方形的一部分,對下一行沒有限制,用0表示

按行號dp,f [ i ] [ j ]表示第 i 行狀態為 j 的方案數,

第 i-1 行的狀態 k 能轉移到第 i 行狀態為 j 當且僅當:

1.j 和 k 執行按位与結果為0(保證每個數字1的下方必須是0)

2.j 和 k 執行按位或結果每一段連續的0都必須有偶數個(若干橫著的1*2長方形)

(按位或后就去掉了和上面一起成為一個長方形的情況)

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
ll f[][<<];
bool b[<<];
int main()
{
while(cin>>n>>m && n){
//預處理出[0,1<<m-1]中所有每一段連續的0都有偶數個的數
for(int i=;i< <<m;i++){
bool cnt=,has_odd=;//cnt為這一段0個數的奇偶性,hasodd為是否為奇數
for(int j=;j<m;j++)
if(i>>j & )
has_odd|=cnt,cnt=;//第j位為1就重置,并記錄在hasodd里
else cnt^=;//更新這一段奇偶性
b[i]=has_odd|cnt ? :;//其中任何一個是1都不行
}
f[][]=;
for(int i=;i<=n;i++)
for(int j=;j< <<m;j++){//枚舉狀態
f[i][j]=;//多組數據初始化
for(int k=;k< <<m;k++)
if((j&k)== && b[j|k])
f[i][j]+=f[i-][k];
}
printf("%lld\n",f[n][]);
}
}

[題解/狀壓dp]POJ_2411_Mondriaan's dream的更多相关文章

  1. [題解](狀壓/水)luogu_P1879玉米田

    大水題然而因為智障的錯誤调了半天......n,m别反着输入啊......內外循環和狀態數都不等價 别的就是記錄一下每一行不可行的點,也狀壓一下,dp的時候判一下即可 #include<bits ...

  2. [題解](單調隊列dp)【2016noip福建夏令營】探險

    P1917 -- 探险 时间限制:1000MS      内存限制:131072KB 题目描述(explore.cpp) π+e去遗迹探险,遗迹里有 N 个宝箱,有的装满了珠宝,有的装着废品. π+e ...

  3. [題解](最短路)luogu_P1119災後重建

    一道好題,然而看題解做的...... floyed的實質:只經過前k個點i到j的最短路,原狀態轉移方程為 f [ k ] [ i ] [ j ]=min( f[ k-1 ] [ i ] [ j ],f ...

  4. [題解]luogu_P1854 花店櫥窗佈置

    來源:題解 一開始看不懂題目,一萬年了終於看懂 f [ i ] [ j ] 表示第i朵花放在第j個花瓶中最大美學值,(花是必須用完嗎?) 顯然放i-1朵花至少要放到前i-1個瓶子里,最多放到前j-1個 ...

  5. [題解]luogu_P3205/BZOJ_1996 合唱隊

    前言:基本上發題解的都是抄的題解所以 來源:題解 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个 ...

  6. [題解]luogu P1156 垃圾陷阱

    前言:[數據刪除] 來源:題解 不發題面了 首先我们来分析题目,“每个垃圾都可以用来吃或堆放”,浓浓的透露出一个背包气息.我们可以类比背包问题的放或不放.于是dp[i][j]dp[i][j]dp[i] ...

  7. [題解] luogu p1220 關路燈

    區間dp 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. ...

  8. [題解](水/數學)luogu_P1147連續自然數和

    尺取法a掉 然而數學解法為 等差數列求和公式: sum(L,R)=(L+R)(R-L+1)/2=M 即(L+R)(R-L+1)=2M 可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1&l ...

  9. [題解](最小生成樹/LCA)luogu_P1967貨車運輸

    一道好題不出所料又抄的題解 1.首先對於這張圖肯定要考慮走哪些邊不走哪些邊,發現我們想要的肯定那些邊權最大的邊,所以想到最大生成樹 這樣能保證選到盡量大的邊 2.跑完最大生成樹后每兩點之間就有唯一路徑 ...

随机推荐

  1. javascript 正则表达式 进阶教程

    学习之前先来说一说一些概念 子项 1.正则的一个分组为一个子项,子项的匹配结果可以在这个子项之后被使用 2.子项是有顺序的,以(出现的位置顺序从左到右,第一个'()'--分组 包含的为第一子项,第二个 ...

  2. cygwin使用笔记

    1.在cygwin里访问Windows盘 cd /cygdrive/c cd c: 2.整合cygwin命令到Windows中 假设cygwin安装在d:/develop/cygwin,则将d:/de ...

  3. Windows程序设计(1)——Win32运行原理(二)

    创建进程 1 进程和线程 2 应用程序的启动过程 3 CreateProcess函数 4 实例 3 创建进程 3.1 进程和线程 进程通常被定义为一个存在运行的程序的实例.进程是一个正在运行的程序,它 ...

  4. PHP执行外部命令【转】

    PHP是完全支持外部命令的,但是出于安全考虑,一般很少使用. PHP提供共了3种方法调用外部命令: (1)调用执行外部命令函数(system(),exec(),passthru(),shell_exe ...

  5. linux应用之Mongodb的安装及配置(centos)

    Mongodb是一种nosql类型的数据库,高性能.易部署.易使用的特点在IT行业非常流行. 下面介绍一下mongodb的安装方式,这里我们是在linux下安装,使用的是centos6.4 64位的, ...

  6. webrtc 学习资源

    http://www.cnblogs.com/lingyunhu/tag/webrtc%20android%20ios/

  7. python中类的定义方法

    # coding =utf-8 ## 类的定义 ##-------------------------------------------------- class Employee: empCoun ...

  8. object_test.py

    #方法,属性,私有化加双下划线 ''' __a 从外部无法访问,但是类的内部可以访问.实际上还是能在类外访问这些私有方法,尽管不应该这么做:s._A__a 如果不需要使用这种方法但是又不行让其他对象不 ...

  9. 洛谷P4009汽车加油行驶问题——网络流24题(最短路)

    题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题: 把每个点拆成各个油量上的点,根据要求连边即可: 注意:点数最大为10 ...

  10. tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...