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;
}

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)[通俗易懂]

    前言在Andrroid开发中,网络请求十分常用而在Android网络请求库中,Retrofit是当下最热的一个网络请求库今天,我将献上一份非常详细Retrofitv2.0的使用教程,希望你们会喜欢。如果对Retrofitv2.0的源码感兴趣,可看文章:Android:手把手带你深入剖析Retrofit2.0源码目录![目录](http://upload-

  • java.lang.Integer常用方法

    java.lang.Integer常用方法+构造函数Integer(intvalue)通过指定的int值构成一个Integer对象。Integer(Strings)通过指定的String值构成一个Integer对象。。+方法int intValue()将此对象转化为int。long longValue()将此对象转化为long。byte byteValue()将此对象转化为byte。sho…

  • python中0xf_Python 0xff作者

    python中0xf_Python 0xff作者我有个错误:UnicodeDecodeError:’utf-8’codeccan’tdecodebyte0xffinposition:0,invalidstartbyte我找到了这个解决方案:^{pr2}$但是如果a)你不知道0xff在哪里和/或b)你需要解码一个file对象,你怎么使用它呢?正确的语法/格式是什么?在我正在解析一个目录,所以我试着一次检查一个文件。(注意:…

  • kong网关教程_网关怎么登陆

    kong网关教程_网关怎么登陆网关是微服务中不可或缺的一部分,它承载了所有请求流量入口,参数验证拦截,用户权限验证,但是除了JAVA的springcloud之外,公共网关屈指可数,其中最受关注的就是KONG了,笔者半年前就已经在使用kong的那时候使用的是0.11.2-bate版本(之前还被官方坑了一次),前不久终于等到了1.X的正式版发布了,笔者就在这里给大家分享一下kong网关的基本情况以及使用安装的方式。附上:喵…

  • FFT算法的物理意义

    FFT算法的物理意义

  • arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行

    arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行这是我来到csdn以来写的第一篇文章,希望能通过文字能把我的学习经过与心得分享给大家。我使用的是Kotlin来编写代码,我将默认各位具有一定的Android编程基础。言归正传,我们接下来要做的第一件事情就是使用AndroidStudio来创建一个空的新项目了我接下来的操作都是遵循arcgisandroid官方进行搭建的,读者看到的时候可能已经出了新的版本了,不过应该是小版本,arcgisandroid主体代码结构应该是不会变的,请放心阅读与搭建欢迎加入我们的QQ交流群249819194.

发表回复

您的电子邮箱地址不会被公开。

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