当前位置: 首页 > news >正文

hdu1693 Eat the Trees 插头dp

题意:有障碍物的多回路的插头dp,求方案数
题解:其实搞懂插头dp的插头方式就和轮廓线dp一样了,因为这题是多回路,不需要单回路的连通性;‘
dp[i][j]表示第i行j状态的方案数
需要注意的是第二维我们维护了m+1个状态,因为对于插头可能会有m+1种情况,对于每一个位置有插头就是1,否则就是0
一共有四种情况:
假设当前位置是障碍物,那么只有没有上插头和左插头的情况能够转移到没有上左插头的情况
假设当前位置不是障碍物,那么

  1. 有上插头和左插头,直接合并两个插头
  2. 有上插头没有左插头,如果能向下,延伸上插头。如果能向右,上插头变成左插头
  3. 没有上插头有左插头,如果能向右,延伸左插头。如果能向下,左插头变成上插头
  4. 没有上左插头,如果能向右和向下,增加一个左插头和上插头
    最后没有上插头和左插头的方案数就是答案
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0)

using namespace std;

const double g=10.0,eps=1e-12;
const int N=(1ll<<12)+10,maxn=1000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;

ll dp[2][N];
int n,m,a[12][12];
ll solve()
{
    memset(dp,0,sizeof dp);
    int now=0,pre=1;
    dp[now][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            swap(now,pre);
            memset(dp[now],0,sizeof dp[now]);
            if(a[i][j]==0)
            {
                for(int k=0;k<(1<<(m+1));k++)
                    if((!((k>>m)&1)) && (!(k&1)))
                        dp[now][k<<1]+=dp[pre][k];
                continue;
            }
            for(int k=0;k<(1<<(m+1));k++)
            {
                if(((k>>m)&1) && (!(k&1)))
                {
                    if(j!=m)dp[now][((k^(1<<m))<<1)|1]+=dp[pre][k];
                    if(i!=n)dp[now][((k^(1<<m))<<1)|2]+=dp[pre][k];
                }
                else if((!((k>>m)&1)) && (k&1))
                {
                    if(i!=n)dp[now][k<<1]+=dp[pre][k];
                    if(j!=m)dp[now][(k<<1)^3]+=dp[pre][k];
                }
                else if((!((k>>m)&1)) && (!(k&1)))
                {
                    if(j!=m&&i!=n)dp[now][(k<<1)|3]+=dp[pre][k];
                }
                else
                {
                    dp[now][((k^(1<<m))<<1)^2]+=dp[pre][k];
                }
            }
        }
    }
    return dp[now][0];
}
int main()
{
    int T;scanf("%d",&T);
    for(int _=1;_<=T;_++)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        printf("Case %d: There are %lld ways to eat the trees.\n",_,solve());
    }
    return 0;
}
/***********************

***********************/

转载于:https://www.cnblogs.com/acjiumeng/p/9095461.html

相关文章:

  • 查找
  • cmd 打开资源监视器
  • 20180516
  • KVM虚拟机新建
  • 异步socket处理
  • jQuery API的特点
  • 爬虫实战篇(模拟登录)---我们以模拟去哪儿网为例
  • 第 11 章 字符串和字符串函数(命令行参数)
  • vue 应用 :关于 ElementUI 的 message 组件
  • Equal Sums
  • [编程之法]2.2 寻找和为定值的两个数
  • 智能对话机器人实战开发案例剖析(1)- 体系结构和分类
  • 第十二 包
  • java8 数据结构的改变(一)
  • 非正常卸载Chrome浏览器导致无法重新安装
  • classpath对获取配置文件的影响
  • Cookie 在前端中的实践
  • Date型的使用
  • emacs初体验
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • PHP 7 修改了什么呢 -- 2
  • React+TypeScript入门
  • Spark RDD学习: aggregate函数
  • vue:响应原理
  • Vue2 SSR 的优化之旅
  • WePY 在小程序性能调优上做出的探究
  • 初识 beanstalkd
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 算法---两个栈实现一个队列
  • 再谈express与koa的对比
  • HanLP分词命名实体提取详解
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #include<初见C语言之指针(5)>
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • ${factoryList }后面有空格不影响
  • (4.10~4.16)
  • (BFS)hdoj2377-Bus Pass
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (搬运以学习)flask 上下文的实现
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (五)Python 垃圾回收机制
  • (正则)提取页面里的img标签
  • *Django中的Ajax 纯js的书写样式1
  • .libPaths()设置包加载目录
  • .NET Core 版本不支持的问题
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 中让 Task 支持带超时的异步等待
  • @Not - Empty-Null-Blank
  • @Pointcut 使用
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [20161101]rman备份与数据文件变化7.txt
  • [2669]2-2 Time类的定义
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [C++]C++入门--引用