HDU 1693 Eat the Trees 插头DP

HDU 1693 Eat the Trees 插头DP

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1693

意甲冠军:给定一个r*c的地,(r,c<=11),当中有的土地上种上了树,有些没有种上树。仅仅能在种上树的地上走,通过走若干个回路,来走遍全部种树的土地。问有多少种走法。

思路:不管怎样还是要先提供一个链接:http://wenku.baidu.com/view/4fe4ac659b6648d7c1c74633.html,是国家队论文。里面对于要提及的概念解说的十分清楚。

dp的过程是从左上角的点到右下角的点进行状态压缩dp。dp[i][j][k]表示第i行第j列时。轮廓线上从左到右是否存在插头的二进制状态k(0表示轮廓线上不存在插头,1表示轮廓线上存在插头)。

每行第零个状态是由右上角的状态第c个状态得到,详细过程是dp[i][0][j<<1]=dp[i-1][c][j]; 这是由于轮廓线从每行的第最后一种状态变成了每行的第一种状态(画画就明确了)。

状态转移也是依据插头的相应情况来写的,是由当前格子的下方轮廓线和右側轮廓线上是否存在插头来决定。

假设下方和右側都存在插头,那么左側和上方就都不能存在插头,所以状态时由上一个状态中相应两位都为0的情况得到。

假设下方和右側都不存在插头,那么左側和上方就都必定存在插头,所以状态时由上一个状态中相应两位都为1的情况得到。

假设下方存在插头,右側不存在插头。或者是右側存在插头,下方不存在插头,那么就可能存在上方存在插头或者是左側存在插头两种情况,分别寻找相应状态加上就可以。

P.S.果然原来插头DP的名字是基于连通性状态压缩的动态规划,本质还是状压…

代码:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define maxn 13
#define PI acos(-1.0)
#define seed 31//131,1313
//#define LOCAL
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
LL dp [maxn][maxn][1<<maxn] ;
int M [maxn][maxn] ;
int row,col;
LL solve(int r,int c)
{
    int tot=1<<(c+1);
    memset(dp,0,sizeof(dp));
    dp[0][c][0]=1;
    for(int i=1; i<=r; i++)
    {
        for(int j=0; j<tot; j++)
            dp[i][0][j<<1]=dp[i-1][c][j];
        for(int j=1; j<=c; j++)
        {
            int st1=(1<<j),st2=(1<<(j-1));
            for(int k=0; k<tot; k++)
            {
                if(M[i][j]==1)
                {
                    if((k&st1)==0&&(k&st2)==0)
                        dp[i][j][k]=dp[i][j-1][k+st1+st2];
                    else if((k&st1)!=0&&(k&st2)!=0)
                        dp[i][j][k]=dp[i][j-1][k-st1-st2];
//                    else
//                    {
//                        dp[i][j][k]+=dp[i][j-1][k];
//                        dp[i][j][k]+=dp[i][j-1][k^st1^st2];
//                    }//与下述状态转移等效。且更优美
                    else if((k&st1)==0&&(k&st2)!=0)
                    {
                        dp[i][j][k]+=dp[i][j-1][k-st2+st1];
                        dp[i][j][k]+=dp[i][j-1][k];
                    }
                    else
                    {
                        dp[i][j][k]+=dp[i][j-1][k-st1+st2];
                        dp[i][j][k]+=dp[i][j-1][k];
                    }
                }
                else if((k&st1)==0&&(k&st2)==0)
                    dp[i][j][k]=dp[i][j-1][k];
            }
        }
    }
    return dp[r][c][0];
}
int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif
    int T;
    scanf("%d",&T);
    for(int ii=1;ii<=T;ii++)
    {
        scanf("%d%d",&row,&col);
        for(int i=1; i<=row; i++)
            for(int j=1; j<=col; j++)
                scanf("%d",&M[i][j]);
        printf("Case %d: There are %I64d ways to eat the trees.\n",ii,solve(row,col));
    }
    return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117382.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 六、小程序|App抓包-移动端抓包app-抓包「建议收藏」

    六、小程序|App抓包-移动端抓包app-抓包「建议收藏」小程序|App抓包移动端抓包app-抓包 ———-IOS设备系统———一、IOS抓包IOS(thor+anubis)app应用市场下载即可:首次安装需要配置证书:抓包:简单测试抓取部分数据包:查看详细数据包内容:点击数据包查看详情:一直摁着,选择重放可进行重放测试thor跳转anubisanubis相关功能点和界面:重放记录:可修改重放:也可进行其他的导出操作:可以将数据包导出联合burp重放———-Android设备系统———二、android移动

    2022年5月27日
    42
  • ireport使用教程_layout怎么导入图片

    ireport使用教程_layout怎么导入图片ireport插入图片1.在模板上拖一个image组件,设置它的image Expression为变量$P{logo},如图示,属性下面的is lazy勾上。  不然有可能最后页面渲染出来的image的src为nullimage_0_0_0。2.给变量logo的值。  StringbasePath=request.getScheme()+”://”+requ

    2025年10月20日
    3
  • pytorch ocr 数字识别库_pytorch handbook

    pytorch ocr 数字识别库_pytorch handbook实时姿态估计网络:https://github.com/Sierkinhane/AtrousPose简单单人跟踪:https://github.com/Sierkinhane/human_tracker(基于目标检测与特征映射算法)演示视频:https://www.bilibili.com/video/av44360925新写的关于人脸检测算法MTCNN的文章https://……

    2025年10月30日
    5
  • C#获取进程的主窗口句柄「建议收藏」

    C#获取进程的主窗口句柄「建议收藏」publicclassUser32API{  privatestaticHashtableprocessWnd=null;  publicdelegateboolWNDENUMPROC(IntPtrhwnd,uintlParam);  staticUser32API()  {    if(processWnd==nu

    2022年7月14日
    21
  • 软件工程导论各种图_软件工程第一章思维导图

    软件工程导论各种图_软件工程第一章思维导图1、E-R图E-R图也是实体-联系图,E-R图属于需求分析的一部分,为了把用户的数据要求清楚、准确地描述出来,系统分析员通常建立一个概念性的数据模型。下面介绍E-R图的画法E-R图由数据对象(实体)、属性、联系三部分组成。通常用矩形框代表实体、用菱形框表示关系,用椭圆形或圆角矩形表示实体(或关系)的属性。例如:2、N-S图出于要有一种不允许违背结构程序设计精神的图形工具的考虑,提出了盒图,又称N-S图。盒图的表示方法有:盒图没有箭头,因此不允许随意转移控制。(

    2022年8月13日
    9
  • 深度学习环境配置2——windows下的torch=1.2.0环境配置「建议收藏」

    深度学习环境配置2——windows下的torch=1.2.0环境配置「建议收藏」神经网络学习小记录48——windows下的torch=1.2.0环境配置学习前言环境内容Anaconda安装下载Cudnn和CUDA配置torch环境安装VSCODE学习前言好多人问环境怎么配置,还是出个教程吧。环境内容torch:1.2.0torchvision:0.4.0Anaconda安装最新版本的Anaconda没有VSCODE,如果大家为了安装VSCODE方便可以直接安装旧版的Anaconda,百度网盘连接如下。也可以装新版然后分开装VSCODE。链接:https://pan

    2022年6月11日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号