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

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

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

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

转载于:https://www.cnblogs.com/zsben991126/p/10364515.html

hdu4064 三进制状态压缩 好题!相关推荐

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

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

  2. #10172. 「一本通 5.4 练习 1」涂抹果酱 【 三进制状态压缩 】【 方案数 】

    Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵) ...

  3. hdu3001 Travelling 三进制状态压缩dp

    tsp类型,只是这里面的点最多可以访问2次. 所以用一个来表示访问了多少次,正好是三进制. 对于每个状态i,先处理出第j位为几,即num[i][j],方便使用. 用dp[i][j]表示,状态i时,以j ...

  4. 动态规划--数位dp--二进制状态压缩

    和与或 给你一个数组R,包含N个元素,求有多少满足条件的序列A使得 0 ≤ A[i] ≤ R[i] A[0]+A[1]+...+A[N-1]=A[0] or A[1]... or A[N-1] 输出答 ...

  5. hdu3001(状态压缩dp)

    题目链接: 点击打开链接 题目: After coding so many days,Mr Acmer wants to have a good rest.So travelling is the b ...

  6. 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划

    例1 骑士(Sgu223) 1592:[例 1]国王 信息学奥赛一本通(C++版)在线评测系统 https://blog.csdn.net/guoyangfan_/article/details/82 ...

  7. 1815. 得到新鲜甜甜圈的最多组数 状态压缩

    1815. 得到新鲜甜甜圈的最多组数 有一个甜甜圈商店,每批次都烤 batchSize 个甜甜圈.这个店铺有个规则,就是在烤一批新的甜甜圈时,之前 所有 甜甜圈都必须已经全部销售完毕.给你一个整数 b ...

  8. poj 3254 Corn Fields 状态压缩dp

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K       Description Farmer John has purchased a ...

  9. POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)

    题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...

最新文章

  1. 抛弃P值,选择更直观的A/B测试!
  2. xml显示浏览器标签_浅析浏览器书签的导入和导出
  3. 把所有的谎言献给你β(找规律数学题)
  4. 大象喝水c语言程序,实现大象喝水(c语言)
  5. Matlab 图像处理的一些杂记
  6. 第十三期:你不想错过的那些JSON工具
  7. Text段、Data段和BSS段
  8. Modbus协议模型
  9. (转)淘淘商城系列——使用maven构建工程时出现的错误
  10. 电脑怎么设计java环境_java环境变量配置,详细教您win7怎么配置java环境变量。
  11. php脚本自动登录telnet,Windows环境上telnet自动登录和运行脚本
  12. CorelDRAWX4的VBA插件开发(二十九)使用C++制作动态连接库DLL辅助VBA构键强大功能-(3)制作最简单的可供调用的DLL
  13. mosse(Minimizing the Output Sum of Squared Error)论文解读
  14. 双霖度盘下载器(第三方百度网盘不限速下载工具)
  15. 物联网云平台的远程管理
  16. 功率因数 matlab,matlab功率因数测量
  17. Resource exhausted: OOM when allocating tensor with shape[620,20000] and type float on /job:localhos
  18. 单击屏幕亮屏流程分析
  19. h5微信页面在手机微信端和微信web开发者工具中都能正常显示,但是在pc端微信浏览器上打不开(显示空白)
  20. html表格字间距怎么调整,word表格中怎么调整文字行间距以及字符间距?

热门文章

  1. 拳王虚拟项目公社:小白如何从0到1搭建个人私域流量池?6招玩转流量裂变法
  2. cups源码下载 linux_正点原子Linux第七十章Linux WIFI驱动实验
  3. 同r做一个窗口_目标检测(Object Detection):R-CNN/SPPnet/R-FCN/Yolo/SSD
  4. oracle12c正在检查环境变量,oracle11g安装客户端检查先决条件失败
  5. 钢琴块2电脑版_云上钢琴学生端电脑版|云上钢琴学生端 V2.3.1 最新PC版 下载_当下软件园...
  6. Golang实践录:静态资源文件整合:初步使用
  7. GBK转unicode码查询表
  8. Linux无网络升级gcc,Linux离线(手动)升级GCC
  9. 【Elasticsearch】Nori:官方的韩语分析插件Elasticsearch
  10. 【Spring】Spring hibernate JSR-303 Validator 自定义参数校验器