黄大佬发了一手插头dp的资料,没学过(菜呀,这玩意好难入门的,结合了2篇资料才看懂,然而入门那题没a,a了更简单的一道(emmmmmmmm),太菜了、

orz这两位聚聚:入门题详解+代码https://blog.csdn.net/litble/article/details/79369147

远古cdq聚聚的论文https://wenku.baidu.com/view/9cfbb16e011ca300a6c390d5.html?qq-pf-to=pcqq.group

插头dp适用:超小数据范围,网格图,连通性。

插头是因为对于状态压缩的dp来说,如果考虑到连通性,普通状态压缩的状态就无法满足了,此时需要维护这一行每个点的联通性。轮廓线就是n+1个围墙(也就是网格之间的边)的状态,通过插头每次转移得到下一次结果的轮廓线,那么得到最终结果的轮廓线的总数时也就是得到了答案。

hdu1693:

求一个网格中,每个非障碍点都被一个圈且这些圈不会重叠联通的种数。

圈圈这玩意,往插头上想吧。

刚开始的轮廓线为0,那么只要最终轮廓线的状态为0就是总答案。对于1,1的插头,只能转移成00

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL LIM=300005,Has=299989;
LL n,m,e1,e2,las,now,tt;LL ans;
LL mp[15][15],bin[15],tot[2];LL js[2][LIM];
LL h[300005],a[2][LIM],ne[LIM];
//tot:状态总数,js:该状态的方案总数,a:各种状态
void ins(LL zt,LL num) {//卓越的哈希技术LL tmp=zt%Has+1;for(LL i=h[tmp];i;i=ne[i])if(a[now][i]==zt) {js[now][i]+=num;return;}ne[++tot[now]]=h[tmp],h[tmp]=tot[now];a[now][tot[now]]=zt,js[now][tot[now]]=num;
}
void work(){tot[now]=1,js[now][1]=1,a[now][1]=0;//初始状态为0,个数为1for(LL i=1;i<=n;++i){for(LL j=1;j<=tot[now];++j) //状态二进制最左边为最小一位,当换行的时候最后一个必定为0a[now][j]<<=1;//则换行的时候最左边那个新的线为0for(LL j=1;j<=m;++j) {las=now,now^=1;memset(h,0,sizeof(h)),tot[now]=0;//  cout <<"----------------------"<<endl;for(LL k=1;k<=tot[las];++k) {LL zt=a[las][k],b1=(zt>>(j-1))%2,b2=(zt>>j)%2;// cout <<i<<" "<<j<<"   status "<<zt <<" "<<b1<<" "<<b2<<endl;//提取关键格子上的两段轮廓线状态,zt表示上一个状态,LL num=js[las][k]; //这个状态的数量if(!mp[i][j]){if(!b1&&!b2)//1个障碍可以有的状态为原状态无右和下的插头//  cout <<"障碍" << "++" <<zt<< endl;ins(zt,num); //表示这里是一个障碍}else if(!b1&&!b2){//对于这个状态,只有右下的状态可以选择,但是可以选的条件是右与下均为空地if(mp[i+1][j]&&mp[i][j+1]){ins(zt+bin[j-1]+bin[j],num);//转移为插头的状态j-1与j各出现一个//cout << "00++ " <<zt+bin[j-1]+bin[j] << "   "<<num <<endl;}}else if(!b1&&b2){ //b1为0,但是b2存在if(mp[i][j+1]){ins(zt,num); //转移成连右边的插头// cout << "01-right " <<zt << "   "<<num <<endl;}if(mp[i+1][j]){// cout << "01-botton" << zt-bin[j]+bin[j-1] <<"   "<< num <<endl;ins(zt-bin[j]+bin[j-1],num); //转移成下面的插头}}else if(b1&&!b2) {if(mp[i][j+1]){ins(zt-bin[j-1]+bin[j],num);//由于左边转移到右边//cout << "10-right" << zt-bin[j-1]+bin[j]  <<"   "<< num <<endl;}if(mp[i+1][j]){// cout << "10-botton" << zt <<" "<<num <<endl;ins(zt,num);//转移到下面,状态不改变}}else if(b1==1&&b2==1){ //因为少了一个,也就是2个联通块匹配在了一次,那么状态中有一个独立的联通块就改为不独立了ins(zt-bin[j-1]-bin[j],num);//cout << "11 " << zt-bin[j-1]-bin[j]  <<" "<<num <<endl;}}}}
}
char s1[1000];
int main(){//freopen("in.txt","r",stdin);//freopen("out1.txt","w",stdout);LL len1,len2,len3;LL T,i,j;scanf("%lld",&T);LL num=0;bin[0]=1;for(i=1;i<=14;++i)bin[i]=bin[i-1]<<1;while(T--){num++;scanf("%lld%lld",&n,&m);now=0;for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%lld",&mp[i][j]);}}work();LL res=0;for(LL k=1;k<=tot[now];++k) {LL zt=a[now][k];if(zt==0)res+=js[now][k];}printf("Case %lld: There are %lld ways to eat the trees.\n",num,res);}return 0;
}

插头DP~(。。。了解了一下下)相关推荐

  1. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 924  Solved: 351 [Submit][S ...

  2. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识--这真的是一种很锻炼人的题型-- 每一道题的状态都不一样 ...

  3. HDU4084 插头dp

    题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法 思路:插头DP或轮廓线,多加一维DP讨论就可以 注意插头DP状 ...

  4. POJ3133(插头dp)

    传送门:http://poj.org/problem?id=3133 Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K       ...

  5. P3272 [SCOI2011]地板(插头DP)

    [题面链接] https://www.luogu.org/problemnew/show/P3272 [题目描述] 有一个矩阵,有些点必须放,有些点不能放,用一些L型的图形放满,求方案数 [题解] ( ...

  6. POJ 3133 Manhattan Wiring (插头DP)

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1110   Accepted: 634 D ...

  7. URAL1519 Formula 1 —— 插头DP

    题目链接:https://vjudge.net/problem/URAL-1519 1519. Formula 1 Time limit: 1.0 second Memory limit: 64 MB ...

  8. [集训队作业2018]小Z的礼物(min-max容斥,插头dp)

    传送门 这种求 "取到所有物品的期望时间" 的题一般都用 min−maxmin-maxmin−max容斥 解决: 设t(i,j)t(i,j)t(i,j)为取到格子(i,j)(i,j ...

  9. 【BZOJ1814】Ural 1519 Formula 1 插头DP

    [BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板 ...

  10. Ural 1519. Formula 1 优美的插头DP

    今天早上学了插头DP的思想和最基础的应用,中午就开始敲了,岐哥说第一次写不要看别人代码,利用自己的理解一点点得写出来,这样才锻炼代码能力!于是下午慢慢地构思轮廓,一点点地敲出主体代码,其实是很磨蹭的, ...

最新文章

  1. 设计ADuC845低噪声信号采集版
  2. Robotium测试没有源码的apk--需重签名apk
  3. PyTorch : torch.nn.xxx 和 torch.nn.functional.xxx
  4. 菜鸟学Java(七)——Ajax+Servlet实现无刷新下拉联动
  5. 【工业控制】学习喷墨打印技术 怎么能不知道波形
  6. 程序员修神之路--缓存架构不够好,系统容易瘫痪
  7. java listview颜色_[摘]android listview选中某一行,成选中状态颜色高亮显示
  8. 我国研发5款自主产权3D显卡;哈啰单车回应异常;Jboot 2.2.4发布 | 极客头条
  9. 百度前端学院-基础学院-第二课
  10. openCV,C++接口,cv::Mat矩阵数据元素读取
  11. 叠螺机_火锅底料加工车间废水离不开叠螺机应用
  12. 服装商品销售数据分析
  13. kubernetes failed to start sandbox
  14. 搭建Android开发环境(超详细)
  15. 关于DTCC数据库技术大会
  16. 银行圈巨变!中国建设银行无人银行开业!
  17. 跟我学大数据分析之五:2019中国城市发展潜力排名
  18. 关于JSP文件的运行方法
  19. 华硕电脑锁定计算机,华硕笔记本电脑的BIOS怎么设置
  20. 【保姆级讲解】C语言---指针精华

热门文章

  1. 利用纯m文件生成ui(二)
  2. mysql 查询临时表_MySQL临时表与内存表
  3. 免费还能商用的视频素材,拿走不谢。
  4. AndroidOTA增量包(差分包)制作记录
  5. mysql cmd 关闭防火墙_MySQL WorkBench:Failed to Connect to MySQL at XXX.XXX.XXX with user XXX
  6. 解决云服务器添加了安全组端口无法访问问题
  7. wincc系统冗余服务器系统专用授权,wincc冗余问题
  8. speedoffice表格如何对内容进行分组?
  9. python制作脑图_使用Python将xmind脑图转成excel用例(一)
  10. html中超链接使用_html超链接有哪些类型 html中,超链接用的是什么标签