HDOJ 2442 -bricks 状态压缩DP 一直TLE.打表过的..
有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.打表过的..的更多相关文章
- HDOJ 2167 Pebbles (状态压缩dp)
题意:给你一个n*n的矩阵,让你从矩阵中选择一些数是的他们的和最大,规则是:相邻的两个数不能同时取,位置为(i,j)的数与(i+1,j),(i-1,j),(i,j+1),(i,j-1),(i+1,j+ ...
- 状态压缩dp(hdu2167,poj2411)
hdu2167 http://acm.hdu.edu.cn/showproblem.php?pid=2167 给定一个N*N的板子,里面有N*N个数字,选中一些数字,使得和最大 要求任意两个选中的数字 ...
- 『最短Hamilton路径 状态压缩DP』
状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...
- [NOIP2016]愤怒的小鸟 状态压缩dp
题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...
- HDU1074(状态压缩DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 状态压缩DP总结
POJ1185 炮兵部队问题: 在平原上才能放置炮兵,每个炮兵的上下左右2格之内都不能出现别的炮兵 可以考虑在当前行放置炮兵它的右侧和下侧绝对不会出现炮兵即可,左侧和上侧就能省去考虑 明显的状态压缩d ...
- 状态压缩DP(大佬写的很好,转来看)
奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...
- P5911 [POI2004]PRZ (状态压缩dp+枚举子集)
题目背景 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 题目描述 桥已经很旧了, 所以它不能承受太重的东西.任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
随机推荐
- redis(四)redis与Mybatis的无缝整合让MyBatis透明的管理缓存
redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用 http://liuyieyer.iteye.com/blog/207809 ...
- SpringMVC入门二: 1规范结构, 2简单整合MyBatis
昨天拿springMVC写的helloworld结构不好, 这次先调整一下体系结构 , 然后简单整合一下MyBatis spring的配置还是以注解为主, 不过MyBatis的映射文件什么的还是拿xm ...
- 十进制字符串转成二进制(decimal to binary)
题目:给一个十进制的字符串例如1.25, 将其转化为二进制字符串,这个例子的结果是1.01 = 1*2^0 + 0*2^(-1) + 1*2^(-2) = 1.25. 如果不能完整的用二进制表示,输出 ...
- QTP的基本功能介绍
• QTP的基本功能介绍 HP QuickTest Professional 支持功能測试和回归測试自己主动化,用于每一个主要软件应用程序和环境.此解决方式使用keyword驱动的測试概念,简化了測试 ...
- 分析一个socket通信: server/client
分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...
- wince下GetManifestResourceStream得到的Stream是null的解决
问题的引入 在编程过程中遇到下面这样一个问题: 有这样一个方法: public static AlphaImage CreateFromResource(string imageResourceNam ...
- html:打开新的页面
在html页面中,打开一个新的页面,有两种方式: 一.利用超链接 <a href="newurl">新页面</a> 上面代码添加了一个新链接,点击链接时会打 ...
- URAL 1792. Hamming Code (枚举)
1792. Hamming Code Time limit: 1.0 second Memory limit: 64 MB Let us consider four disks intersectin ...
- Revit 2015 API 的全部变化和新功能
这里从SDK的文章中摘录出全部的API变化.主要是希望用户用搜索引擎时能找到相关信息: Major changes and renovations to the Revit API APIchange ...
- C#基础 大盘点
类型转换 tryParse 字符和整形转换 转译符: /' 单引号 /" 双引号 // 反斜杠 /0 空字符 /a 感叹号( ...