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 ...
随机推荐
- Python 2.7 学习笔记 面向对象的编程
python是一种面向对象的语言.本文介绍如何用python进行面向对象的编程. 首先我们说下对象和类,类是一种类型的定义,对象是类的实例. 一.内置对象类型(内置类) 其实我们前面已经大量用到了对象 ...
- maven仓库--私服(Nexus的配置使用)
maven--私服的搭建(Nexus的使用)和注意的问题 私服是什么 私服,私有服务器,是公司内部Maven项目经常需要的东东,不总结一下,不足以体现出重视.Nexus是常用的私用Maven服务器,一 ...
- 基于visual Studio2013解决算法导论之017查找第n小元素
题目 查找第n小元素 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...
- Zabbix Step 1 : Install CentOS6.5 and Configration
[root@myzabbix Desktop]#rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2- ...
- 解决screen Cannot open your terminal '/dev/pts/1'问题
转载于:http://urchin.blog.51cto.com/4356076/1153322 问题描述: userA首先登录系统,使用screen开启了一个session,然后detach这个窗口 ...
- 第三届蓝桥杯 c/c++真题
第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多 ...
- JavaScript 字符串编码函数
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- CentOS6.5 服务器+apache5.3绑定多个域名+SELinux设置
下面简单的介绍了如何通过设置Apache的http.conf文件,进行多个域名以及其相关的二级域名的绑定(假设我们要绑定的域名是minidx.com和ntt.cc,二级域名是blog.minidx.c ...
- Linux 命令整理
一.文件目录命令 1.建立目录:mkdir 目录名 2.删除空目录:rmdir 目录名 3.无条件删除子目录: rm -rf 目录名 4.改变当前目录:cd 目录名 (进入用户home目录:cd ~; ...
- CH BR13数学(啥?-a^b≡a^b mod phi(p)+phi(p)(mod p)(b>=phi(p))公式)
啥? Beta Round #13 (数学专场) 背景 有人写了一个RSA加密给我玩. 描述 我赌5毛前面两题的内容也就开头几句话平时会用到. 还是做点具体的东西吧. 求c^d Mod N 输入格式 ...