CF293B Distinct Paths题解
CF293B Distinct Paths
题意
给定一个\(n\times m\)的矩形色板,有kk种不同的颜料,有些格子已经填上了某种颜色,现在需要将其他格子也填上颜色,使得从左上角到右下角的任意路径经过的格子都不会出现两种及以上相同的颜色。路径只能沿着相邻的格子,且只能向下或者向右。
计算所有可能的方案,结果对 \(1000000007 (10^9 + 7)\)
输入及输出格式
输入格式
第一行,三个整数$ n, m, k (1 \le n, m \le 1000, 1 \le k \le 10)$;
接下来\(n\)行,每行包含\(m\)个整数,表示颜色。其中\(0\)表示未涂色,非\(0\)表示颜色的编号, 颜色编号为\(1\)到\(k\)。
输出格式
一行,一个整数,表示涂色方案对$ 1000000007 (10^9 + 7)$求模的结果。
样例
此处就不挂了:传送门
思路
看似数据很大:\(n, m, k (1 \le n, m \le 1000, 1 \le k \le 10)\),但是,\(k<n+m-1\) 时,可以直接输出\(0\)。因为无法走完一条路径(一条路径长度为\(n+m-1\),因为是只能向下、向右走)。
那么实际数据范围很小,大概是$n+m-1 \le 10 $左右吧。
这么小的范围很容易就可想到\(dfs\)。这里有两个优化,一个是如果搜到一半,发现剩下的颜色不够用了就直接\(return\)。还有一个就是利用颜色\(A\)与颜色\(B\)的先后次序问题,路径\(AB\)与路径\(BA\)并不是同一种方案,所以搜索时如果搜到是第一次时,就可以直接乘\(now\)就可以省去很多\(dfs\)。
代码很丑,勿喷。
#include<algorithm>
#include<bitset>
#include<complex>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<locale>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<typeinfo>
#include<utility>
#include<valarray>
#include<vector>
#include<cstring>
#include<cmath>
#define MOD 1000000007
using namespace std;//恶心的头文件
inline int read(){
char ch=getchar();int res=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar();
return res*f;
}//读入优化
inline void write(int zx){
if(zx<0) zx=-zx,putchar('-');
if(zx<10) putchar(zx+'0');
else{
write(zx/10);
putchar(zx%10+'0');
}
}//输出优化
int n,m,k,cnt[50],a[50][50],sum,f[30][30],ps,ans,vv;
int dfs(int x,int y){
if(y==m+1){return dfs(x+1,1);}
if(x==n+1) return 1;
int S=0,num=0,mar=0,res=0,las=0;
f[x][y]=f[x-1][y]|f[x][y-1];
for(int i=1;i<=k;i++){
if(!(f[x][y]&(1<<i-1))) ++num;
}
if(num<n+m-x-y+1) return 0;//第一个优化
if(a[x][y]==0){
for(int i=1;i<=k;i++){
if(!(f[x][y]&(1<<i-1))){
if(cnt[i]==0){
if(mar) res+=las,res%=MOD;//第二个优化
else{
mar=1;
cnt[i]++;
f[x][y]|=1<<i-1;
las=dfs(x,y+1);
f[x][y]^=1<<i-1;
cnt[i]--;
res+=las;
res%=MOD;
}
continue ;
}
cnt[i]++;
f[x][y]|=1<<i-1;
res+=dfs(x,y+1);
f[x][y]^=1<<i-1;
cnt[i]--;
res%=MOD;
}
}
}else{
if(!(f[x][y]&(1<<a[x][y]-1))){
f[x][y]|=1<<a[x][y]-1;
res+=dfs(x,y+1);
f[x][y]^=1<<a[x][y]-1;
res%=MOD;
}
}
return res;
}
int main(){
n=read();m=read();k=read();
vv=n+m-1;
if(k<vv){//开始先特判
puts("0");
return 0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=read();
cnt[a[i][j]]++;
}
}
ans=dfs(1,1);
cout<<ans<<endl;
return 0;
}
CF293B Distinct Paths题解的更多相关文章
- CF293B. Distinct Paths
B. Distinct Paths time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- CF293B Distinct Paths 搜索
传送门 首先数据范围很假 当\(N + M - 1 > K\)的时候就无解 所以对于所有要计算的情况,\(N + M \leq 11\) 超级小是吧,考虑搜索 对于每一个格子试填一个数 对于任意 ...
- [codeforces 293]B. Distinct Paths
[codeforces 293]B. Distinct Paths 试题描述 You have a rectangular n × m-cell board. Some cells are alrea ...
- [CF293B]Distinct Paths_搜索_剪枝
Distinct Paths 题目链接:http://codeforces.com/problemset/problem/293/B 数据范围:略. 题解: 带搜索的剪枝.... 想不到吧..... ...
- "Shortest" pair of paths[题解]
"Shortest" pair of paths 题目大意 给出 \(n\) 个点,\(m\) 条边,除第一个点和最后一个点外,其他所有的点都只能被经过一次,要求找到两条从第一个点 ...
- World Tour Finals 2019 D - Distinct Boxes 题解
太神了,专门写一篇题解 qwq 简要题意:给你 \(R\) 个红球和 \(B\) 个蓝球,你要把它们放到 \(K\) 个箱子里,要求没有两个箱子完全相同(即两种球个数就相同),求 \(K\) 的最大值 ...
- POJ3068:"Shortest" pair of paths——题解
http://poj.org/problem?id=3068 题目大意: 从0-n-1找到两条边和点都不相同(除了0和n-1外)的最小费用路径. ——————————————————————————— ...
- POJ3177:Redundant Paths——题解
http://poj.org/problem?id=3177 明显要求桥的一道题. (因为有桥就说明只能从那一条路走,换句话说就是只有一种方法) 求完桥后按照结论(加几条边成双连通图的结论,不会请ba ...
- SPOJ694/DISUBSTR:Distinct Substrings——题解
https://vjudge.net/problem/SPOJ-DISUBSTR https://www.luogu.org/problemnew/show/SP694 http://www.spoj ...
随机推荐
- 野指针(Wild pointer)和悬垂指针(dangling pointer)
详细参考如下: Dangling pointer(悬垂指针.迷途指针)和 Wild pointer(野指针) 迷途指针经常出现在混杂使用malloc() 和 free() 库调用: 当指针指向的内存释 ...
- 序列内第k小查询(线段树)
最近请教了一下大佬怎么求序列内第k大查询,自己又捣鼓了一下,虽然还没有懂得区间第k大查询,不过姑且做一个记录先吧 因为每个元素大小可能很大而元素之间不连续,所以我们先离散化处理一下,程序中的ori[ ...
- 关于connect by 误区讲解,纯属个人心得和经验,有图有文字
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6927541.html 如果觉得对您有帮 ...
- Mac下Clang编译libcurl
使用终端进入curl的根目录下,执行 ./configre CC=clang make make install 之后前往/usr/local/lib下生成了libcurl.a和相应的动态库,头文件在 ...
- 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍
简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...
- Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)
高级教程:如何编写可重用的app (page 13) 本节教程上接第七部分(Page 12).我们会把我们的 web-poll应用转换成一个独立的python包,你可以在新的项目中重用或者把它分享给其 ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)
编写你的第一个 Django app,第五部分(Page 10)转载请注明链接地址 我们继续建设我们的 Web-poll 应用,本节我们会为它创建一些自动测试. 介绍自动测试 什么是自动测试 测试是简 ...
- EM算法(Expectation Maximization Algorithm)
EM算法(Expectation Maximization Algorithm) 1. 前言 这是本人写的第一篇博客(2013年4月5日发在cnblogs上,现在迁移过来),是学习李航老师的< ...
- Spyder之Object Inspector组件
Spyder之Object Inspector组件 最新版的Spyder已经把它修改为Help组件了. Quick access to documentation is a must for ever ...
- 同一条sql语句,只是改变了搜索的条件,就很慢?
重建索引: ) 显示索引信息: dbcc showcontig('表名’) 具体参考:http://www.cnblogs.com/bluedy1229/p/3227167.html