HDU 2280 Tetris Comes Back
状态压缩,$dp$,预处理。
设$dp[i][j]$为前$i-1$行填满,第$i$行为状态$j$的最小需要$1$种类的数量。预处理好每种状态能推出哪些状态,并且记录下所需花费就可以了。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar();
x = ;
while(!isdigit(c)) c = getchar();
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
} struct X
{
int nx,cost;
}q[];
int n,c,cnt;
vector<int>v[];
char s[][];
int st[];
int dp[][]; int check(int s,int pos)
{
if(s&(<<pos)) return ;
return ;
} void dfs(int S,int no,int p,int nx,int co)
{
if(p==)
{
q[cnt].nx=nx; q[cnt].cost=co;
v[S].push_back(cnt); cnt++;
return ;
} if(check(no,p))
dfs(S,no,p+,nx,co); //
if(check(no,p)==)
dfs(S,no+(<<p),p+,nx,co+); //
if(p>&&check(no,p)==&&check(nx,p)==&&check(nx,p-)==)
dfs(S,no+(<<p),p+,nx+(<<p)+(<<(p-)),co);
//
if(p+<=&&check(no,p)==&&check(no,p+)==&&check(nx,p)==&&check(nx,p+)==)
dfs(S,no+(<<p)+(<<(p+)),p+,nx+(<<p)+(<<(p+)),co); //
if(p+<=&&check(no,p)==&&check(no,p+)==)
dfs(S,no+(<<p)+(<<(p+)),p+,nx,co); //
if(check(no,p)==&&check(nx,p)==)
dfs(S,no+(<<p),p+,nx+(<<p),co); //
if(p+<=&&check(no,p)==&&check(nx,p)==&&check(nx,p+)==)
dfs(S,no+(<<p),p+,nx+(<<p)+(<<(p+)),co); //
if(p+<=&&check(no,p)==&&check(no,p+)==&&check(nx,p+)==)
dfs(S,no+(<<p)+(<<(p+)),p+,nx+(<<(p+)),co); //
if(p+<=&&check(no,p)==&&check(no,p+)==&&check(nx,p)==)
dfs(S,no+(<<p)+(<<(p+)),p+,nx+(<<p),co);
} void init()
{
cnt=;
for(int i=;i<(<<);i++) dfs(i,i,,,);
} int main()
{
init(); while(~scanf("%d%d",&n,&c))
{
for(int i=;i<n;i++) scanf("%s",s[i]);
for(int i=;i<n;i++)
{
st[i]=;
for(int j=;j<;j++)
{
int x=s[i][j]-'';
st[i]=st[i]+x*(<<j);
}
} st[n]=; memset(dp,-,sizeof dp); dp[][st[]]=; for(int i=;i<n;i++)
{
for(int j=;j<;j++)
{
if(dp[i][j]==-) continue;
//printf("********\n");
for(int t=;t<v[j].size();t++)
{
int id=v[j][t];
if(c-dp[i][j]<q[id].cost) continue;
if(st[i+]&q[id].nx) continue;
if(dp[i+][(q[id].nx)|st[i+]]==-) dp[i+][(q[id].nx)|st[i+]]=dp[i][j]+q[id].cost;
else dp[i+][(q[id].nx)|st[i+]]=min(dp[i+][(q[id].nx)|st[i+]],dp[i][j]+q[id].cost);
}
}
} if(dp[n][]!=-&&dp[n][]<=c) printf("YES\n");
else printf("NO\n");
}
return ;
}
HDU 2280 Tetris Comes Back的更多相关文章
- hdu 5374 Tetris(模拟)
pid=5374">题目链接:hdu 5374 Tetris 模拟.每次进行操作时推断操作是否合法,合法才运行,否则跳过.每次一个token落地,推断一下是否有消除整行. #inclu ...
- HDU 5374 Tetris (2015年多校比赛第7场)
1.题目描写叙述:点击打开链接 2.解题思路:本题要求模拟俄罗斯方块游戏.然而比赛时候写了好久还是没过. 后来补题发现原来是第四步的逻辑实现写错了... 题目中要求假设一整行能够消除,那么仍然运行该步 ...
- HDU 2280 状压DP
用dfs找到状态的最优解 且那个正方形块可以由两个水平块组成,所以无需考虑 #include <cstdio> #include <cstring> #include < ...
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- hdu 1811 Rank of Tetris - 拓扑排序 - 并查集
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...
- HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 1811:Rank of Tetris(并查集+拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系 ...
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
题目链接: 传送门 Rank of Tetris Time Limit: 1000MS Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- 用AngularJS操作DOM
在angular中使用第三方插件时最好都封装到指令(directives)中去,DOM操作也最好都解构到指令中. <!DOCTYPE html> <html lang="e ...
- BZOJ4423 AMPPZ2013Bytehattan(并查集)
判断网格图中某两点是否被割开,可以将割边视为边区域视为点,转化为可切割这两点的区域是否连通.于是每次判断使两个区域连通后是否会形成环(边界视为连通),若是则说明被两点被割开.并查集维护. #inclu ...
- ubuntu下opencv使用cvNamedWindow()和cvShowImage()出错的解决方法
重装系统和opencv,编译运行显示一副图像的程序,报错如下 liurf@liurf-Lenovo-G470:~/WorkSpace/slambook-master/ch5/imageBasics$ ...
- [USACO] 2004 Open MooFest 奶牛集会
题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等 ...
- [hdu 4417]树状数组+离散化+离线处理
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 把数字离散化,一个查询拆成两个查询,每次查询一个前缀的和.主要问题是这个数组是静态的,如果带修改 ...
- Ubuntu1604 install netease-cloud music
Two issue: 1. There is no voice on my computer, and the system was mute and cannot unmute. eric@E641 ...
- [转]使用 LDAP OU 限制访问
使用 LDAP OU 限制访问 http://www-01.ibm.com/support/knowledgecenter/api/content/SSEP7J_10.2.2/com.ibm.swg. ...
- 【LuoguP1169 bzoj1057】[ZJOI2007]棋盘制作
首先把矩阵转化一下,把横纵坐标和为偶数点的值取反,这样就转化成求最大的'0'或'1'矩阵. 这道题每个数字是在格子内的,不能在边界包含障碍点. 求最大的0矩阵时,把1作为障碍点.求1同理. 然后求最接 ...
- 01-导航实例-QQ空间Demo示例程序源代码
01-导航实例-QQ空间.zip62.4 KB // MJLoginViewController.h Map // // MJLoginViewController.h // 01-导航实例-QQ ...
- shell脚本之while for if 语句和编写计划任务
关于while循环: while do done 例如 1.关于内存的实时操作: (1).vim a.sh (2).输入以下while循环 (3)../a.sh执行脚本 2.自加一的操作: (1).v ...