还不太会做这类题,总之感觉有点难啊。

用深搜代替打表求出一行所有的可行状态,注意要进行剪枝

这是自己理解的代码,但是tle了

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define maxn 600005
int n,m,dp[][maxn],sum;
char mp[][][];
int a[],tag,flag,s[];
//
void dfs(int r,int num,int up,int down,int right){//用dfs搜索出第r行的下状态,上状态 和右侧颜色
int xx,rr,yy,ll,i;
if(num==m){//搜满了一行
if(r==)dp[flag][down]+=tag;//如果是第一行,那么只要把组成这种状态的方案数加上即可
else {
dp[flag][down]+=dp[(flag+)%][up]*tag;//加上上一行下状态为up的计数值
dp[flag][down]%=mod;
}
return;
}
for(int i=;i<;i++)//判断改行第i个方块是不是四方相同的
if(mp[r][num][i]!=mp[r][num][])break;
if(i==){//四方相同的块直接跳过即可,并且这一行的结果要加上4
tag*=;
xx=a[mp[r][num][]];
if(xx==right || right==-)dfs(r,num+,up*+xx,down*+xx,xx);
tag/=;
return;
} for(int i=;i<;i++){//枚举该方块的安放方式,符合条件的进入下一轮深搜
xx=a[mp[r][num][i]];//下一格上方
rr=a[mp[r][num][(i+)%]];//下一格右侧
yy=a[mp[r][num][(i+)%]];//下一格下放
ll=a[mp[r][num][(i+)%]];//下一格左侧
if(right==- || ll==right)//如果是第一格或者左侧对上这一格的右侧,就可以往下搜了
dfs(r,num+,up*+xx,down*+yy,rr);
}
} int ncase,t;
void init(){
cin>>ncase;a['F']=,a['C']=,a['R']=;
s[]=;
for(int i=;i<=;i++)s[i]=s[i-]*;//使用三进制
flag=;
memset(dp,,sizeof dp);
} int main(){
init();
for(int t=;t<=ncase;t++){
cin>>n>>m;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
cin>>mp[i][j]; for(int i=;i<n;i++){//利用滚动数组,dp[flag][s]表示第i行状态s下的方案数
tag=;flag^=;
memset(dp[flag],,sizeof dp[flag]);
dfs(i,,,,-);
} sum=;
for(int i=;i<s[m];i++)//求和
sum+=dp[flag][i],sum%=mod; printf("Case %d: %lld\n",t,sum);
}
}

hdu4064 三进制状态压缩 好题!的更多相关文章

  1. BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...

  2. hdu-3001 三进制状态压缩+dp

    用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...

  3. 三进制状态压缩DP(旅行商问题TSP)HDU3001

    http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others)     ...

  4. HDU 3001 Travelling (三进制状态压缩 DP)

    题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...

  5. HDOJ-3001(TSP+三进制状态压缩)

    Traving HDOJ-3001 这题考察的是状态压缩dp和tsp问题的改编 需要和传统tsp问题区分的事,这题每个点最多可以经过两次故状态有3种:0,1,2 这里可以模仿tsp问题的二进制压缩方法 ...

  6. hdu 2167(状态压缩基础题)

    题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...

  7. hdu 1565(状态压缩基础题)

    题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...

  8. poj 3254(状态压缩基础题)

    题意:就是你给一个n行m列的矩阵,矩阵里的元素由0和1组成,1代表肥沃的土地可以种植作物,0则不可以种植作物,并且相邻的土地不能同时种植作物,问你有多少种种植方案. 分析:这是我做的第一道状态压缩dp ...

  9. poj1185 状态压缩经典题

    状态压缩的好题,直接求会爆内存,先把所有可能的状态求出来存在stk里,然后f[i][k][t]表示i行状态为t,i-1状态为k,由i-1状态来推出i状态即可 注意要打好边际条件的状态,并且某个可行状态 ...

随机推荐

  1. linux find 只获取文件名而去除路径

    find /var/process_log/ -name '*.log' -exec basename {} \;

  2. Gulp简明使用教程

    Glup用自动化构建工具增强你的工作流程! 同类型的软件还有Grunt.关于两者的区别可以参考这篇文章Grunt VS Gulp 安装: $ npm install gulp -g $ npm ins ...

  3. python第四天,list补充

    当我们创建的列表中,元素的排列顺序常常是无法预测的,因为我们并非总能控制用户提供数据的顺序.这虽然在大多数情况下都是不可避免的,但我们经常需要以特定的顺序从呈现信息.有时候,我们希望保留列表元素最初的 ...

  4. Python学习笔记-解释器和中文编码

    第一行 #!/usr/bin/env python 目的是指出用什么可执行程序去运行代码. 有两种写法 1.#!/usr/bin/python 调用/usr/bin下的python解释器,去运行代码. ...

  5. 2. Spring Boot项目启动原理初探

    SpringBoot从宏观上说,就是对spring容器进行了一层包装.它内部的入口是利用 SpringApplication类的static的 run 方法进行启动的,调用的图: 上图中的这些方法都位 ...

  6. 利用微信企业号的告警功能,联动检测ICMP的shell脚本

    作者:邓聪聪 由于设备IP众多,为了及时发现IP地址有不可达现象,利用微信的联动报警,及时发现问题,以下是脚本内容!!! ping.sh #!/bin/bash ###SCRIPT_NAME:icmp ...

  7. python3+selenium入门15-执行JavaScript

    有时有些功能需要通过js来执行,比如拖动浏览器的滚动条.通过execute_script()方法可以执行js的代码 window.scrollTo()可以传两个参数,第一个参数是下方滚动条的位置,第二 ...

  8. LabVIEW--为控件添加说明信息

    之前只知道为VI添加说明信息(在VI的属性里面添加,快捷键ctrl+I 打开),今天知道了控件也可以添加说明信息,这样就方便了许多,极大的提高了程序的可读性.

  9. 前端 -----js 定时器

    定时器   在js中的定时器分两种:1.setTimeout() 2.setInterval() 1.setTimeOut() 只在指定时间后执行一次 /定时器 异步运行 function hello ...

  10. python 初识函数

    1.什么是函数 函数就是对一个代码块 或者功能的封装,什么时候用,什么时候执行 语法: def  函数名():            函数体(代码块) 函数的调用 函数名()          #所有 ...