Codeforces 293B Distinct Paths DFS+剪枝+状压
题面
题目链接
题意翻译
【问题描述】
给定一个 $ n*m $ 的矩形色板,有 $ k $ 种不同的颜料,有些格子已经填上了某种颜色,现在 需要将其他格子也填上颜色,使得从左上角到右下角的任意路径经过的格子都不会出现两种 及以上相同的颜色。路径只能沿着相邻的格子,且只能向下或者向右。 计算所有可能的方案,结果对 $ 1000000007 (10^9 + 7) $ 求模。
【输入数据】
第一行,三个整数 $ n, m, k (1 \leq n, m \leq 1000, 1 \leq k \leq 10) $ ; 接下来 $ n $ 行,每行包含 $ m $ 个整数,表示颜色。其中 $ 0 $ 表示未涂色,非 $ 0 $ 表示颜色的编号, 颜色编号为 $ 1 $ 到 $ k $ 。
【输出数据】
一行,一个整数,表示涂色方案对 $ 1000000007 (10^9 + 7) $ 求模的结果
输入输出样例
输入样例#1
2 2 4
0 0
0 0
输出样例#1
48
输入样例#2
2 2 4
1 2
2 1
输出样例#2
0
输入样例#3
5 6 10
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
输出样例#3
3628800
输入样例#4
2 6 10
1 2 3 4 5 6
0 0 0 0 0 0
输出样例#4
4096
说明
【时空限制】
2000ms,256MB
思路
首先题目是吓人的。n+m-1>k的时候显然是无解的。那么输出0。
那么范围就缩小很多了。
然后就没有别的办法了。搜索吧
但是可以加这样两个剪枝
1.在填某一个格子时,如果某些颜色在之前没有使用过,那么他们的情况数都是相同的
2.如果剩余颜色不能支撑你走到终点,那就直接返回0
另外,记录颜色可以用状压
AC代码
#include<bits/stdc++.h>
const int mod=1e9+7;
const int maxn=12;
using namespace std;
int n,m,k;
int MAP[maxn][maxn],use[maxn];
int Board[maxn][maxn];
int Num(int x)
{
int ans=0;
while(x) x-=x&(-x),ans++;
return ans;
}
int dfs(int x,int y)
{
if(y==m+1) x++,y=1;
if(x==n+1) return 1;
int now=(Board[x-1][y]|Board[x][y-1]),kind=-1;
int ans=0;
if(n-x+m-y+1+Num(now)>k) return 0;
for(int i=1;i<=k;i++)
{
if((1<<(i-1))&now) continue;
if(MAP[x][y] && MAP[x][y]!=i) continue;
Board[x][y]=((1<<(i-1))|now);
use[i]++;
if(use[i]==1)
{
if(kind==-1) kind=dfs(x,y+1);
ans+=kind;
}
else ans+=dfs(x,y+1);
ans%=mod;
use[i]--;
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
if(n+m-1>k)
{
printf("0");
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&MAP[i][j]);
use[MAP[i][j]]++;
}
printf("%d",dfs(1,1));
return 0;
}
总结
没想到纯搜索题也能出这么难。。以后还要多练啊
Codeforces 293B Distinct Paths DFS+剪枝+状压的更多相关文章
- UVA 10318 Security Panel(DFS剪枝 + 状压 + 思维)题解
题意:给一个r*c的矩阵开关(初始全打开的),每次按下一个开关都会改变3*3范围内的有*的地方的状态,问你最少几步能让开关全闭上,按升序输出按哪些按钮 思路:每个按钮至多按一下,按按钮的顺序和结果无关 ...
- [Codeforces 163D]Large Refrigerator (DFS+剪枝)
[Codeforces 163D]Large Refrigerator (DFS+剪枝) 题面 已知一个长方体的体积为V,三边长a,b,c均为正整数,求长方体的最小表面积S V以质因数分解的形式给出 ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- Codeforces Round #384 (Div. 2) //复习状压... 罚时爆炸 BOOM _DONE
不想欠题了..... 多打打CF才知道自己智商不足啊... A. Vladik and flights 给你一个01串 相同之间随便飞 没有费用 不同的飞需要费用为 abs i-j 真是题意杀啊, ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- Coco dfs 或者 状压dp。...
C -- Coco Time Limit:1s Memory Limit:64MByte Submissions:148Solved:85 DESCRIPTION Coco just learned ...
- Codeforces 375C - Circling Round Treasures(状压 dp+最短路转移)
题面传送门 注意到这题中宝藏 \(+\) 炸弹个数最多只有 \(8\) 个,故考虑状压,设 \(dp[x][y][S]\) 表示当前坐标为 \((x,y)\),有且仅有 \(S\) 当中的物品被包围在 ...
- Codeforces Beta Round #16 E. Fish (状压dp)(概率dp)
Codeforces Beta Round #16 (Div. 2 Only) E. Fish 题目链接:## 点击打开链接 题意: 有 \(n\) 条鱼,每两条鱼相遇都会有其中一只吃掉对方,现在给你 ...
- codeforces gym #101161H - Witcher Potion(状压DP)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 总共有n瓶药可供选择 每瓶药可以增加$e_i$点体力,和$p_i$点毒性 每分钟消耗1点毒 ...
随机推荐
- [Bzoj3743][Coci2015] Kamp【换根Dp】
Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...
- kuangbin带我飞QAQ 并查集
1. POJ 2236 给出N个点,一开始图是空白的,两个操作,一个是增加一个点(给出坐标),一个是查询两个点间是否相通,当两点间的距离小于D或者两点通过其他点间接相连时说这两个点相通.并查集维护,每 ...
- Unity 在2D中实现LookAt
由于Transform.LookAt是使Z轴看向目标,而2D基本是由X和Y轴构成的.所以在2D的游戏中,不太好使用. 所以用代码实现一个2D的LookAt函数. 例子: 我们使怪物的眼睛一直看着云. ...
- Leetcode95. Unique Binary Search Trees II不同的二叉搜索树2
给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,nul ...
- Windows API 23 篇 WTSQuerySessionInformation
函数原型:BOOLWINAPIWTSQuerySessionInformationW( IN ...
- leetcode 376Wiggle Subsequence
用dp解 1)up定义为nums[i-1] < nums[i] down nums[i-1] > nums[i] 两个dp数组, up[i],记录包含nums[i]且nums[i-1] & ...
- leyou_01_自定义异常处理器
1.自定义异常处理器,当程序发生异常时可以我们可以自己定义返回的,状态码和状态信息 2.当异常发生时调用我们的自定义异常 @RestController @RequestMapping("i ...
- ERROR:ORA-30076: 对析出来源无效的析出字段
DEBUG:key: sql: select count(*) as col_0_0_ from jc_user cmsuser0_ where 1=1 and cmsuser0_.register_ ...
- 适配器模式(Adapter\Adaptee)
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. (1)目标(Target)——客户所期待得到的接口,目标可以是具体的或抽象的类,也可以是接 ...
- jmeter设置代理
JMeter设置Http代理对web或者app进行录制 一.录制web 1.首先保证JMeter的安装环境都正确.启动JMeter:在安装路径的bin目录下双击jmeter.bat (例如:D:\ap ...