云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么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. July 27th, Week 31st Wednesday, 2016

    Don't let yesterday take up too much of today. 别让昨天的事情占据今天太多时间. Learn from yesterday, but don't let ...

  2. July 12th, Week 29th Tuesday, 2016

    When the traveler goes alone he gets acquainted with himself. 独自旅行可以让人更好地了解自己. With other's company, ...

  3. python基础——递归函数

    python基础——递归函数 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用 ...

  4. .NET生成word文档服务器配置常见问题

    注意:安装office2003的时候一定要选择 "完全安装" 而不是 "典型安装" 错误:System.Runtime.InteropServices.COME ...

  5. LeetCode之Min Stack 实现最小栈

    LeetCode相关的网上资源比较多,看到题目一定要自己做一遍,然后去学习参考其他的解法. 链接: https://oj.leetcode.com/problems/min-stack/ 题目描述: ...

  6. Android悬浮窗注意事项

    一 动画无法运行 有时候,我们对添加的悬浮窗口,做动画的时候,始终无法运行. 那么,这个时候,我们可以对要做动画的View,再添加一个parent,即容器.将要做动画的View放入容器中. 二 悬浮窗 ...

  7. mysql封装类

    <?php ;         ;         $cnt = mysql_num_rows($rsPtr);         ;         ) {             $id =  ...

  8. poj 2019 二维rmq *

    题目大意:给出一个N*N矩形,每个格子上有一个价值.询问一个b*b的矩形在左上角的位置(x,y),(x+b-1,y+b-1)这一部分的最大值-最小值是多少. 模板题 #include <stdi ...

  9. Hadoop_10_shuffle02_详解Shuffle过程【来源网络】推荐更为详细

    网址:http://www.cnblogs.com/felixzh/p/4680808.html Shuffle过程,也称Copy阶段.reduce task从各个map task上远程拷贝一片数据, ...

  10. 寒假D1 B

    B - B Crawling in process... Crawling failed Time Limit:0MS     Memory Limit:0KB     64bit IO Format ...