状态压缩,$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的更多相关文章

  1. hdu 5374 Tetris(模拟)

    pid=5374">题目链接:hdu 5374 Tetris 模拟.每次进行操作时推断操作是否合法,合法才运行,否则跳过.每次一个token落地,推断一下是否有消除整行. #inclu ...

  2. HDU 5374 Tetris (2015年多校比赛第7场)

    1.题目描写叙述:点击打开链接 2.解题思路:本题要求模拟俄罗斯方块游戏.然而比赛时候写了好久还是没过. 后来补题发现原来是第四步的逻辑实现写错了... 题目中要求假设一整行能够消除,那么仍然运行该步 ...

  3. HDU 2280 状压DP

    用dfs找到状态的最优解 且那个正方形块可以由两个水平块组成,所以无需考虑 #include <cstdio> #include <cstring> #include < ...

  4. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  5. hdu 1811 Rank of Tetris - 拓扑排序 - 并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  6. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  8. HDU 1811 Rank of Tetris(拓扑排序+并查集)

    题目链接: 传送门 Rank of Tetris Time Limit: 1000MS     Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...

  9. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. oracle大数据匹配处理C#

    忙碌了几天写出来的oracle存储过程在作业中执行. 写的oracle存储过程如果有什么不好的地方大家指点指点. oracle存储过程其中使用到游标嵌套.if.if嵌套.数据插入表.select插入表 ...

  2. 【BZOJ 4556】[Tjoi2016&Heoi2016]字符串 SAM+二分+主席树

    这道题市面上就两种法:一种是SA+二分+主席树,一种是SAM+二分+主席树(有不少人打线段树合并???)(除此之外还有一种利用炒鸡水的数据的暴力SA,贼快.....)(当时学SA的时候没做这道题,现在 ...

  3. POJ3189:Steady Cow Assignment(二分+二分图多重匹配)

    Steady Cow Assignment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7482   Accepted: ...

  4. zigbee芯片 - JN5169

    http://www.nxp.com/products/wireless-connectivity/2.4-ghz-wireless-solutions/support-resources-for-j ...

  5. GTK+与MFC不完全对比

    转载自:http://tech.ddvip.com/2007-11/119640973738229.html 1. 两者都是基于面向对象设计的.尽管MFC是用C++写的,而GTK+是用C写的,但思想都 ...

  6. MySql数据库学习总结(MySQL入门到精通)

    2017.1.24-2.3日(在大兴实验室) 1.数据库存储引擎: (1)MyISAM: 访问速度快,对事物完整性没要求,并以访问为主的适合这个 (2)InnoDB: 更占磁盘空间,需要进行频繁的更新 ...

  7. {CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队

    D 五色战队 SRM 06 背景&&描述         游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等.         日向彼方:吾令人观其气,气成五彩, ...

  8. [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树

    Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...

  9. gpio子系统和pinctrl子系统(上)

    前言 随着内核的发展,linux驱动框架在不断的变化.很早很早以前,出现了gpio子系统,后来又出现了pinctrl子系统.在网上很难看到一篇讲解这类子系统的文章.就拿gpio操作来说吧,很多时候都是 ...

  10. virtualbox网络相关

    前言 Baidu/google了n多次, 效果不佳. 网上说的都是比较老的virtualbox版本,有的是默认就bridge方式(2.2.0前), 有的不是bridge方式的,是通过工具uml-uti ...