hdu4064 三进制状态压缩 好题!
还不太会做这类题,总之感觉有点难啊。
用深搜代替打表求出一行所有的可行状态,注意要进行剪枝
这是自己理解的代码,但是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 三进制状态压缩 好题!的更多相关文章
- BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...
- hdu-3001 三进制状态压缩+dp
用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...
- 三进制状态压缩DP(旅行商问题TSP)HDU3001
http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others) ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- HDOJ-3001(TSP+三进制状态压缩)
Traving HDOJ-3001 这题考察的是状态压缩dp和tsp问题的改编 需要和传统tsp问题区分的事,这题每个点最多可以经过两次故状态有3种:0,1,2 这里可以模仿tsp问题的二进制压缩方法 ...
- hdu 2167(状态压缩基础题)
题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...
- hdu 1565(状态压缩基础题)
题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...
- poj 3254(状态压缩基础题)
题意:就是你给一个n行m列的矩阵,矩阵里的元素由0和1组成,1代表肥沃的土地可以种植作物,0则不可以种植作物,并且相邻的土地不能同时种植作物,问你有多少种种植方案. 分析:这是我做的第一道状态压缩dp ...
- poj1185 状态压缩经典题
状态压缩的好题,直接求会爆内存,先把所有可能的状态求出来存在stk里,然后f[i][k][t]表示i行状态为t,i-1状态为k,由i-1状态来推出i状态即可 注意要打好边际条件的状态,并且某个可行状态 ...
随机推荐
- C++11 线程并发
并发 头文件<future> <thread> 高级接口 async().future<> future<int> result1; //int为fun ...
- Solr版本问题分析
在之前的Solr版本中(Solr5之前),在创建core的时候,Solr会自动创建好schema.xml,但是在之后的版本中,新加入了动态更新schema功能,这个默认的schema.xml确找不到了 ...
- 20165234 《Java程序设计》第二周课下作业
1. 教材代码完成情况测试P14 把100改为自己的后四位学号,编译运行Kernighan.java 代码的功能是从给定一个数字,实现从1依次加到此数的和. 如下是我用命令行实现代码的编译与运行. 2 ...
- win10家庭版多用户
1.Windows 找不到gpedit.msc https://jingyan.baidu.com/article/54b6b9c08b08382d593b4747.html 2.win10家庭版 创 ...
- IPC$横向渗透代码实现
思路 IPC$横向渗透的方法,也是病毒常用的扩散方法. 1.建立连接 2.复制文件到共享中C$.D$.E$.F$ 3.获取服务器的时间 3.设定计划任务按时间执行 用到的Windows API 建立网 ...
- nginx反向代理解决跨域
nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上.通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问.对于浏览器来说,访问的就是同源服务器上的一个 ...
- C++ URLencode library
I need a library that can URLencode a string/char array. Now, I can hex encode an ASCII array like h ...
- CreateDialog和DialogBox
原文地址:https://blog.csdn.net/aikker/article/details/5631412 INT_PTR DialogBox( HINSTANCE hIns ...
- 高效的多维空间点索引算法 — Geohash 和 Google S2
原文地址:https://www.jianshu.com/p/7332dcb978b2 引子 每天我们晚上加班回家,可能都会用到滴滴或者共享单车.打开 app 会看到如下的界面: app ...
- ionic配置
这个问题在升级ionic2的时候可能会遇到,不一定是windows,但是解决办法都是一样的,其实很简单,就是sass不支持当前的环境,那么在当前环境重新安装一下就好了 先卸载: npm uninsta ...