Description:

一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数

Hint:

\(n,m<=12\)

Solution:

插头dp模板题,注意要讨论多种情况,详见代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mxn=15,c[4]={0,-1,1,0};
struct data {
int key; ll val;
};
int n,m,t,ex,ey;
char mp[mxn][mxn];
unordered_map<int ,data > dp[3];
typedef unordered_map<int ,data >::iterator uit; inline void copy(data x,int id) {dp[id][x.key<<2]=(data){x.key<<2,x.val};} //复制一遍 inline int get(int st,int x) {x<<=1; return (st>>x)&3;}
inline int md(int st,int x,int val) {x<<=1; return (st&(~(3<<x)))|(val<<x);} inline int getl(int st,int x) {
int l=x,cnt=1;
while(cnt!=0) cnt+=c[get(st,--l)];
return l;
} inline int getr(int st,int x) {
int r=x,cnt=-1;
while(cnt!=0) cnt+=c[get(st,++r)];
return r;
} inline void update(int x,int y,data d)
{
int st=d.key; ll val=d.val;
int p=get(st,y),q=get(st,y+1);
if(mp[x][y]=='*') {
if(p==0&&q==0) dp[t^1][st]=(data){st,dp[t^1][st].val+val};
return ;
}
if(p==0&&q==0) {
if(x==n-1||y==m-1) return ;
int nst=md(st,y,1); nst=md(nst,y+1,2);
dp[t^1][nst]=(data){nst,dp[t^1][nst].val+val};
return ; //不要少写return
}
if(p==0||q==0) {
if(y<m-1) {
int nst=md(st,y,0); nst=md(nst,y+1,p+q);
dp[t^1][nst]=(data){nst,dp[t^1][nst].val+val};
}
if(x<n-1) {
int nst=md(st,y,p+q); nst=md(nst,y+1,0);
dp[t^1][nst]=(data){nst,dp[t^1][nst].val+val};
}
return ;
}
int nst=md(st,y,0); nst=md(nst,y+1,0);
if(p==1&&q==1) nst=md(nst,getr(st,y+1),1);
if(p==2&&q==2) nst=md(nst,getl(st,y),2);
if(p==1&&q==2&&(x!=ex||y!=ey)) return ;
dp[t^1][nst]=(data){nst,dp[t^1][nst].val+val};
} int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i) scanf("%s",mp[i]);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
if(mp[i][j]=='.') ex=i,ey=j;
t=0; dp[t][0]=(data){0,1ll};
for(int i=0;i<n;++i) {
dp[2].clear();
for(uit j=dp[t].begin();j!=dp[t].end();++j) copy((*j).second,2);
dp[t].clear();
for(uit j=dp[2].begin();j!=dp[2].end();++j) dp[t][(*j).second.key]=(*j).second; //这里由于map不支持直接修改键值,所以先全部拿出来,再处理
for(int j=0;j<m;++j) {
dp[t^1].clear();
for(uit k=dp[t].begin();k!=dp[t].end();++k)
update(i,j,(*k).second);
t^=1;
}
}
printf("%lld",dp[t][0].val);
return 0;
}

[BZOJ1814]Formula 1的更多相关文章

  1. 【BZOJ1814】Ural 1519 Formula 1 (插头dp)

    [BZOJ1814]Ural 1519 Formula 1 (插头dp) 题面 BZOJ Vjudge 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制 ...

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

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

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

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

  4. BZOJ1814: Ural 1519 Formula 1(插头Dp)

    Description Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic gam ...

  5. bzoj1814 Ural 1519 Formula 1(插头DP)

    对插头DP的理解还不是很透彻. 先说一下肤浅的理解吧. 插头DP使用范围:指数级复杂度,且适用于解决网格图连通性问题,如哈密顿回路等问题.插头一般指每相邻2个网格的接口. 题目难度:一般不可做. 使用 ...

  6. bzoj1814: Ural 1519 Formula 1 动态规划 插头dp

    http://acm.timus.ru/problem.aspx?space=1&num=1519 题目描述 一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数. ...

  7. 插头DP讲解+[BZOJ1814]:Ural 1519 Formula 1(插头DP)

    1.什么是插头$DP$? 插头$DP$是$CDQ$大佬在$2008$年的论文中提出的,是基于状压$D$P的一种更高级的$DP$多用于处理联通问题(路径问题,简单回路问题,多回路问题,广义回路问题,生成 ...

  8. redmine computed custom field formula tips

    项目中要用到Computed custom field插件,公式不知道怎么写,查了些资料,记录在这里. 1.http://apidock.com/ruby/Time/strftime 查看ruby的字 ...

  9. salesforce 零基础开发入门学习(十五)salesforce中formula的使用(不含Date/Time)

    本文参考官方的formula介绍PDF:https://resources.docs.salesforce.com/200/latest/en-us/sfdc/pdf/salesforce_usefu ...

随机推荐

  1. 步步为营-86-WSFUpload组件

    文件上传组件,所需js文件和图片在百度网盘对应的文件夹下 <%@ Page Language="C#" AutoEventWireup="true" Co ...

  2. 009-Python-面向对象

    1.面向对象: 1.1什么是类? 类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念: 1.2什么是对象? 对象:就是基于类而创建的一个具体事物(具体存在的)也是特征和动作整合到一起 ...

  3. python---通过递归和动态规划策略解决找零钱问题

    也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...

  4. [转] whistle--全新的跨平台web调试工具

    whistle是基于Node实现的跨平台web调试代理工具,类似的工具有Windows平台上的Fiddler+Willow,基于Java实现的Charles,及公司同事基于Node实现的Livepoo ...

  5. 解决h5网页微信分享链接不能显示缩略

    <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js& ...

  6. 考虑实现一个不抛异常的swap

    Effective C++:参考自harttle land 类的swap实现与STL容器是一致的:提供swap成员函数, 并特化std::swap来调用那个成员函数. class Widget { p ...

  7. 强大的xargs

    xargs 命令是最重要的 Linux 命令行技巧之一.你可以使用这个命令将命令的输出作为参数传递给另一个命令.例如,搜索 png 文件然后对其进行压缩或者其它操作: find. -name *.pn ...

  8. redis监控脚本

    while [ 1 == 1 ]  ; do   now=$(date "+%Y-%m-%d_%H:%M:%S")  ; echo "================== ...

  9. 008 RestFul API 拦截器

    一:任务 1.任务 过滤器Filter 拦截器Interceptor 切片Aspect 二:过滤器 1.新建包 2.自定义过滤器程序 加了注解,这个过滤器在springboot中就起作用了 packa ...

  10. 完全背包-hdu1114

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题目描述: 代码实现: #include<cstdio> #include<i ...