云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了

这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了

dp思想都在代码注释里

思想是很好想的..唯一的难点大概是 c++里面没有同或这种东西 得自己写

而我又不怎么会位运算 问了蕾姐半天也没搞懂怎么用~这个取反符号

到最后怒而手写了函数

一开始想的是 init后 输入nm都可以秒出 但是在使用~的路途上 发现至少我的方法 做这个题 不能做到init后随便输入

因为 每行 都有(1<<m)-1个砖块需要去放 而我又采用的是上下都是0 我默认去放一个竖着的砖块 这样 我dp的时候 对每种m 都要设置边界 因为上一行和这一行的砖块 我枚举出来的数字的二进制都未必有m位 如果仅仅按照~来看 如果忽略符号位什么的 也是不对的 因为后面的那些0 被忽视了

所以每个数 如果枚举不到m位 我就把它当作m位 这个设置 在qf(int x,int len)里面

由于我需要输入m后再进行init 那么时间复杂度当然会比较高 limit:1000ms time:656ms 回头我再去看别人的直接算的办法

题目的错点 long long dp %I64d

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
using namespace std;
/// 状压dp 传说中黄老师讲的摆砖块
long long int dp[15][1<<12];
/// dp[i][k] i x k 状态
int n,m;
int qf(int x , int len)
{
int w=0;
int A[15];
memset(A,0,sizeof(A));
while(x>0)
{
w++;
A[w]=x%2;
x/=2;
}
int res=0;
for(int i=1; i<=len; i++)
{
int q=1;
if(A[i]==1)
continue;
for(int l=1; l<i; l++)
{
q*=2;
}
res+=q;
}
return res;
}
int l(int a,int b,int len)
{
return ((qf(a,len)&qf(b,len)));
}
/// 放置 1 未放置 0
/// 每次放置都进行判断
/**
枚举 : 只枚举横向放置的砖块 砖块的可行性为judge函数
1 枚举每种状态 与上一行的进行比较 如果上1下1 可以 上1下0 可以 上0下1 不可以 上0上0 全部改为1
2 对每种上0下0的状态进行改变 即 即 使其加上 ((~a)&(~b)) 得到同或后的值
3 对这种改变之后的dp数组进行改变
4 最后输出的是dp[n][(1<<m)-1] 上a 下b 的判断
(a^b)&b!=0 continue;
**/
bool judge(int x)
{
int A[15];
int w=0;
int z;
z=x;
while(z)
{
w++;
A[w]=z%2;
z/=2;
}
for(int i=1; i<=w; i++)
{
if(A[i]==1)
{
if(i+1>w||A[i+1]!=1)
return false;
i++;
}
}
return true;
}
int len;
int sz[2000];
void ok()
{
for(int i=0; i<=(1<<m)-1; i++)
{
if(judge(i))
{
len++;
sz[len]=i;
}
}
}
void init()
{
len=0;
ok();
memset(dp,0,sizeof(dp));
for(int k=0; k<=(1<<m)-1; k++)
{
if(judge(k))
{
dp[1][k]=1;
}
}
for(int i=2; i<=n; i++)
{
for(int j=1; j<=len; j++)
{
for(int k=0; k<=(1<<m)-1; k++)
{
int a=k;
int b=sz[j];
if(((a^b)&b)!=0)
continue;
b+=l(a,b,m);
dp[i][b]+=dp[i-1][k]; }
}
}
}
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
init();
printf("%I64d\n",dp[n][(1<<m)-1]);
}
}

  

FZU 1025 状压dp 摆砖块的更多相关文章

  1. FZU - 2218 Simple String Problem 状压dp

    FZU - 2218Simple String Problem 题目大意:给一个长度为n含有k个不同字母的串,从中挑选出两个连续的子串,要求两个子串中含有不同的字符,问这样的两个子串长度乘积最大是多少 ...

  2. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  3. fzu2188 状压dp

    G - Simple String Problem Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  4. POJ 1185 炮兵阵地(状压DP)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26426   Accepted: 10185 Descriptio ...

  5. HDU2825 Wireless Password 【AC自动机】【状压DP】

    HDU2825 Wireless Password Problem Description Liyuan lives in a old apartment. One day, he suddenly ...

  6. 【状压dp】互不侵犯KING

    互不侵犯KING Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3866  Solved: 2264[Submit][Status][Discuss] ...

  7. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  8. noi省选 [九省联考2018]一双木棋题解(状压dp)

    比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...

  9. Poj 2411 Mondriaan's Dream(状压DP)

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...

随机推荐

  1. [SVN(ubuntu)] ubuntu使用svn

    转载自:http://lee2013.iteye.com/blog/1058047 SVN作为日常开发中不可缺少的工具,Ubuntu下的SVN安装十分简单,sudo apt-get install s ...

  2. 爱情之路(codevs 2070)

    题目描述 Description yh非常想念他的女朋友小y,于是他决定前往小y所在的那块大陆. 小y所在的大陆共有n个城市,m条双向路,每条路连接一个或两个城市.经过一条路ei需要耗费时间ti.此外 ...

  3. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

  4. 【读书笔记】读《JavaScript设计模式》之适配器模式

    一.定义 适配器模式可用来在现有接口和不兼容的类之间进行匹配.使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象.在设计类的时候旺旺会遇到有些接口不能与现有API ...

  5. WPF MVVM 关闭View

    在ViewModel中定义一个变量: private Action _closeAction; 在ViewModel的构造函数中这样定义:public MainWindowViewModel(Acti ...

  6. hdu 4268 multiset+贪心

    Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形? /* ...

  7. loj 1168(Tarjan应用)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26882 思路:一开始把题意理解错了,还以为是简单路径,然后仔细一看 ...

  8. php二位数组合并

    转自:http://www.cnblogs.com/losesea/archive/2013/06/14/3134900.html 题目:有以下2个二维数组 1$a=Array(0 => Arr ...

  9. js:数据结构笔记9--二叉树

    树:以分层的方式存储数据:节点:根节点,子节点,父节点,叶子节点(没有任何子节点的节点):层:根节点开始0层: 二叉树:每个节点子节点不超过两个:查找快(比链表),添加,删除快(比数组): BST:二 ...

  10. 不用写软件,纯JS 实现QQ空间自动点赞

    这里分享一个自己写的点赞JS,已实现了好友动态.右侧栏猜你喜欢 点赞,有兴趣的朋友可以加上去玩玩.打开浏览器的开发者模式运行就可以看到效果了 var count = 0; var total = 0; ...