gan这两题怎么差不多

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; bool u[];
LL f[][];
int main()
{ int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)break;
int li=(<<m)-; for(int i=;i<=li;i++)
{
int cc=;u[i]=true;
for(int j=m-;j>=;j--)
if(i&(<<j))
{
if(cc%==)u[i]=false;
cc=;
}
else cc++;
if(cc%==)u[i]=false;
} //-------------------------- memset(f,,sizeof(f));f[][]=;
for(int i=;i<=n;i++)
for(int zt=;zt<=li;zt++)
for(int lzt=;lzt<=li;lzt++)
if((lzt&zt)==&&u[lzt|zt]==true)
f[i][zt]+=f[i-][lzt];
printf("%lld\n",f[n][]);
}
return ;
}

poj2311

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; char ss[][]; int b[];
int f[][][];
int len,z[],d[];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%s",ss[i]+);
for(int i=;i<=n;i++)
{
b[i]=;
for(int j=;j<=m;j++)
if(ss[i][j]=='H')b[i]^=(<<(j-));
} int li=(<<m)-;len=;
for(int i=;i<=li;i++)
{
int cc=-,dd=;bool bk=true;
for(int j=;j<=m-;j++)
if(i&(<<j))
{
if(j-cc<=){bk=false;break;}
cc=j;dd++;
}
if(bk==true){z[++len]=i;d[len]=dd;}
} //-------------------------- int now=,ans=;f[now][][]=;
for(int i=;i<=n;i++)
{
now^=;
for(int j=;j<=len;j++) if(i==||(!(z[j]&b[i-])))
{
for(int k=;k<=len;k++) if( (!(z[k]&b[i])) && (!(z[j]&z[k])) )
{
f[now][j][k]=;
for(int p=;p<=len;p++) if( (i<=||(!(z[p]&b[i-]))) && (!(z[j]&z[p])) && (!(z[k]&z[p])) )
{
f[now][j][k]=max(f[now][j][k],f[now^][p][j]+d[k]);
}
ans=max(ans,f[now][j][k]);
}
}
}
printf("%d\n",ans);
return ;
}

poj1185

同样0/1区分特殊位置,同样预处理当前行的合法状态,同样用位运算判断合法

还是插头DP有意思哈哈,还很快哩

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL mod=; struct Plug_DP
{
LL f[];
int top;LL sta[],hash[];
void pha(LL s,LL sum)
{
LL x=s%mod;
while(hash[x]!=&&sta[hash[x]]!=s)x=(x+)%mod;
if(hash[x]==)sta[++top]=s,hash[x]=top;
f[hash[x]]+=sum;
}
void clean()
{
top=;
memset(hash,,sizeof(hash));
memset(f,,sizeof(f));
}
}dp[];
LL get_bracket(LL s,LL p)
{
return ((s>>(p-))&);
}
LL set_bracket(LL s,LL p,LL v)
{
s^=(get_bracket(s,p)<<(p-));
s^=(v<<(p-));
return s;
} int n,m;LL ans;
void Plug_DP()
{
int pre=,now=;
dp[now].clean();dp[now].pha(,);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
swap(pre,now);dp[now].clean();
for(int k=;k<=dp[pre].top;k++)
{
LL s=dp[pre].sta[k],sum=dp[pre].f[k];
LL p=get_bracket(s,j),q=get_bracket(s,j+); if(i==n&&j==m)
{
if((p==&&q==)||(p==&&q==))ans+=sum;
continue;
} if(p==&&q==)
{
if(i!=n)
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,sum);
}
if(j!=m)
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,sum);
}
}
if((p==&&q==)||(p==&&q==))
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,sum);
}
}
}
for(int k=;k<=dp[now].top;k++)dp[now].sta[k]<<=;
}
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)break;
ans=;Plug_DP();
printf("%lld\n",ans);
}
return ;
}

poj2311(Plug_DP)

0x56 状压DP的更多相关文章

  1. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  2. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  3. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  4. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  5. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  6. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  7. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  8. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

  9. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

随机推荐

  1. Deutsch lernen (15)

    1.    unterscheiden - unterschied - unterschieden  区别,区分:(能够)分清 Die beiden Begriffe sind nur schwer ...

  2. Memcached 之分布式算法原理

    memcached并不像mongodb一样可以配置多个节点,并且节点之间可以”自动分配数据“,即相互通信,所以我们在做memcache分布式集群的时候要有一个算法来保证当一台memcache服务器宕机 ...

  3. marquee标签弹幕效果

    播放个视频的时候看到很有趣的弹幕,想着前端能不能做个弹幕效果.弹幕是滚动的,所以首先想到了<marquee>标签.但事实上,<marquee>标签不是w3c的标准,只是主流的浏 ...

  4. Arrays工具类的使用

    1.包: java.util 导包 2.此类包含用来操作数组(比如排序和搜索)的各种方法 特点: 该类中的方法都是静态方法,所以可以直接使用类名.方法名(实参)调用 3.查看成员方法: public ...

  5. 用电销机器人让电销企业迈入AI智能时代

    2019年是AI智能快速发展的一年,有非常多的企业已经用AI智能代替原有的传统员工做重复性高的工作,就拿销售行业来说,为了让电销员工提升工作效率,拥有更多的成单,大部分有电销岗位的公司都会把重复率较高 ...

  6. luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描

    后缀数组有一个十分有趣的性质: $height[rk[i]] >= height[rk[i-1]] - 1$    Code: #include <bits/stdc++.h> #d ...

  7. appium+python,app自动化测试框架

    目前正在写一个app的自动化UI测试框架,目录结构如, 脚本还在调试,实现的方法是从excel表格读取测试用例,执行完成后会将结果保存到Excel中. 等待.......

  8. 什么是Capability

    desired capability的功能是配置Appium会话.他们告诉Appium服务器您想要自动化的平台和应用程序. Desired Capabilities是一组设置的键值对的集合,其中键对应 ...

  9. supervisor---elasticsearch 采坑回顾

    supervisor 是一个可以管理进程的软件,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervi ...

  10. C#学习笔记_03_运算符

    03_运算符 算数运算符 + - * / % ++ -- 赋值运算符 = += -= *= /= %= 关系运算符 > < >= <= == != 逻辑运算符 &:逻辑 ...