有5个砖块..加上一个空着不放..那么有6种状态..所以很明显的可以用6进制的状态DP...

不过这么做..我觉得我已经能优化的都优化了...还是超时..一看数据范围是100*6..打表先AC了..

看有大神用3进制状态DP水过..Orz...看了好久没看懂...觉得自己状态DP还是很表面~~

Program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<set>
#include<algorithm>
#include<cmath>
#define oo 1000000007
#define ll long long
#define pi acos(-1.0)
#define MAXN 505
using namespace std;
int sharp[6][6][2]={{{0,0},{0,0},{0,0},{0,0},{0,0}},
{{0,0},{1,0},{1,1},{2,0},{-1,-1}},
{{0,1},{1,0},{1,1},{1,2},{2,1}},
{{0,0},{0,1},{0,2},{1,1},{-1,-1}},
{{0,0},{0,1},{0,2},{1,0},{-1,-1}},
{{0,0},{0,1},{1,0},{2,0},{-1,-1}}
};
int n,m,canuse[132],w[132],tall[132],dp[101][132][132],num,step[6]={0,4,5,4,4,4};
bool f[132][132][2];
bool legal(int x) // 判断这一行这么安排是否合法
{
int i,j,t=x,a[10][10];
memset(a,0,sizeof(a));
w[num+1]=0;
for (i=1;i<=m;i++)
{
if (i+1>m && (x%6==1 || x%6==5)) return false;
if (i+2>m && (x%6==2 || x%6==3 || x%6==4)) return false;
for (j=0;j<step[x%6];j++)
a[sharp[x%6][j][0]][i+sharp[x%6][j][1]-1]++;
w[num+1]+=step[x%6];
x/=6;
}
for (i=0;i<10;i++)
for (j=0;j<10;j++)
if (a[i][j]>1) return false;
tall[num+1]=0;
for (i=1;i<=m;i++)
{
if (t%6==1 || t%6==2 || t%6==5)
tall[num+1]=2;
else
if (t%6!=0 && tall[num+1]<1)
tall[num+1]=1;
t/=6;
}
return true;
}
bool ok(int a,int b,int tp) //判断是否冲突
{
int i,j,h[10][10];
a=canuse[a],b=canuse[b];
memset(h,0,sizeof(h));
for (i=1;i<=m;i++)
{
for (j=0;j<step[a%6];j++)
h[sharp[a%6][j][0]][i+sharp[a%6][j][1]-1]++;
a/=6;
}
for (i=1;i<=m;i++)
{
for (j=0;j<step[b%6];j++)
h[sharp[b%6][j][0]-tp][i+sharp[b%6][j][1]-1]++;
b/=6;
}
for (i=0;i<10;i++)
for (j=0;j<10;j++)
if (h[i][j]>1) return false;
return true;
}
int main()
{
freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);
int r,i,j,x,ans,totol;
while (~scanf("%d%d",&n,&m))
{
totol=1;
for (i=1;i<=m;i++) totol*=6;
num=0;
for (i=0;i<totol;i++)
if (legal(i)) canuse[++num]=i;
memset(dp,0,sizeof(dp));
memset(f,true,sizeof(f));
for (i=1;i<=num;i++)
for (j=1;j<=num;j++)
for (x=1;x<=2;x++)
f[i][j][x]=ok(i,j,x);
for (r=1;r<=n;r++)
for (i=1;i<=num;i++)
if (tall[i]+r<=n)
for (j=1;j<=num;j++)
if (f[i][j][1])
for (x=1;x<=num;x++)
if (f[i][x][2])
dp[r][j][i]=max(dp[r][j][i],dp[r-1][x][j]+w[i]); ans=0;
for (i=1;i<=num;i++) ans=max(ans,dp[n][i][1]);
printf("%d,",ans);
}
return 0;
}

HDOJ 2442 -bricks 状态压缩DP 一直TLE.打表过的..的更多相关文章

  1. HDOJ 2167 Pebbles (状态压缩dp)

    题意:给你一个n*n的矩阵,让你从矩阵中选择一些数是的他们的和最大,规则是:相邻的两个数不能同时取,位置为(i,j)的数与(i+1,j),(i-1,j),(i,j+1),(i,j-1),(i+1,j+ ...

  2. 状态压缩dp(hdu2167,poj2411)

    hdu2167 http://acm.hdu.edu.cn/showproblem.php?pid=2167 给定一个N*N的板子,里面有N*N个数字,选中一些数字,使得和最大 要求任意两个选中的数字 ...

  3. 『最短Hamilton路径 状态压缩DP』

    状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...

  4. [NOIP2016]愤怒的小鸟 状态压缩dp

    题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...

  5. HDU1074(状态压缩DP)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  6. 状态压缩DP总结

    POJ1185 炮兵部队问题: 在平原上才能放置炮兵,每个炮兵的上下左右2格之内都不能出现别的炮兵 可以考虑在当前行放置炮兵它的右侧和下侧绝对不会出现炮兵即可,左侧和上侧就能省去考虑 明显的状态压缩d ...

  7. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  8. P5911 [POI2004]PRZ (状态压缩dp+枚举子集)

    题目背景 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 题目描述 桥已经很旧了, 所以它不能承受太重的东西.任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时 ...

  9. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

随机推荐

  1. 同步机制Lock初学(转)

    前段时间review同事的代码,发现可以简化成如下的模型: Thread 1 Thread 2 lock.lock(); condition.await(); lock.unlock() lock.l ...

  2. Net::OpenSSH 模块使用

    use Net::OpenSSH; my $host = "$ip"; my $user = 'root'; my $passphrase = 'uxxxxxD'; my $key ...

  3. 基于visual Studio2013解决算法导论之046广度优先搜索

     题目 广度优先搜索 解决代码及点评 // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <stac ...

  4. zoj 2277 The Gate to Freedom

    N^N = X --->    Nlog10(N) = log10( X ) ---->    X的最高位为 Nlog10(N) 小数部分的第一个非0位 #include<stdio ...

  5. Android Dialog详解

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  6. line-height具体解释

    章:浏览器与Hack].7.3.5 应用:单行文字在垂直方向居中在网页设计中,往往为了突出标题而加入背景图案.如图7-31所看到的. watermark/2/text/aHR0cDovL2Jsb2cu ...

  7. C语言中关于scanf函数的用法

    scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...

  8. webform之session传值(临时数据的存储)与扩展属性 --(购物车练习)

    页面传值:1.QueryString传值在源页面写:Response.Redirect("Main.aspx?uid="+uid+"&pwd="+pwd ...

  9. CF#213DIV2:B The Fibonacci Segment

    You have array a1, a2, ..., an. Segment [l, r] (1 ≤ l ≤ r ≤ n) is good if ai = ai - 1 + ai - 2, for ...

  10. Qt学习之路(54): 自定义拖放数据对象

    前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对 ...