状态压缩,$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 ;
}

最新文章

  1. Android WebView 302斗争之旅
  2. 基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用
  3. Linq常用语法详细
  4. #pragma pack(push,1)与#pragma pack(1)的区别
  5. Tomcat环境配置
  6. 界面显示两个ListView
  7. phpStudy
  8. 【CodeForces 599A】D - 特别水的题4- Patrick and Shopping
  9. php email邮箱正则验证
  10. 在美国看中国HTML5市场的发展
  11. Oracle - PL/SQL Commands
  12. 通过HTML条件注释判断IE版本的HTML语句详解&lt;!--[if IE]&gt; &lt;![endif]--&gt;
  13. CVE-2015-1635,MS15-034 漏洞测试
  14. MySQL-教学系统数据库设计
  15. Spring MVC ajax:post/get 的具体实现
  16. Qt5构建出错问题解决办法
  17. it&#39;s a big trick
  18. 迁移svn项目到git
  19. Gitlab迁移之数据库报错解决
  20. CF932E Team Work(第二类斯特林数)

热门文章

  1. win7中输入文件夹首字母跳到相应的文件或者文件夹,却在搜索栏出现输入的字母
  2. 【题解】HNOI2017大佬
  3. BZOJ3132 上帝造题的七分钟 【二维树状数组】
  4. Tomcat-Jdbc-Pool连接池参数说明
  5. 【BZOJ 4500 矩阵】
  6. 【COGS 2434】 暗之链锁 树上差分+LCA
  7. jQuery.getJSON跨域访问的正确使用方式(史上最傻瓜式解释)
  8. Codeforces Round #524 (Div. 2) D. Olya and magical square
  9. 1040: [ZJOI2008]骑士~基环外向树dp
  10. javascript中arguments的应用——不定项传参求和