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;
}
转载于:https://www.cnblogs.com/yzx1798106406/p/9871478.html
CF293B Distinct Paths题解相关推荐
- CF981H K Paths
CF981H K Paths 题解 一道不错的分治ntt题目 题目稍微转化一下,就是所有k条链的存在交,并且交的部分都被覆盖k次 所以一定是两个点,之间路径选择k次,然后端点两开花 f[x]表示x子树 ...
- 第拾壹章學習 Lisp 3rd Edition, Winston Horn
2019独角兽企业重金招聘Python工程师标准>>> PROPERTIES AND ARRAYS --------------------------------- propert ...
- LeetCode 52. N-Queens II
原题链接在这里:https://leetcode.com/problems/n-queens-ii/description/ 题目: Follow up for N-Queens problem. N ...
- 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- 文献阅读-10X单细胞揭示肿瘤浸润性T细胞的泛癌单细胞图谱
Pan-cancer single cell landscape of tumor-infiltrating T cells INTRODUCTION 针对肿瘤特异性T细胞的癌症免疫疗法使许多癌症患者 ...
- 点双连通分量边双联通分量详解
文章目录 点双连通分量 前言 概念 性质 找割点 找点双 附赠题表 边双连通分量 概念 性质 找割边 找边双 做法1 做法2 题表 一点个人感想 点双连通分量 前言 由于点双和边双都是无向图里面的东西 ...
- 问题 H: Hopscotch
问题 H: Hopscotch 时间限制: 5 Sec 内存限制: 128 MB 提交: 42 解决: 18 [提交][状态][讨论版][命题人:admin] 题目描述 You're playin ...
- OI每周刷题记录——lrllrl
看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...
- 软件学院软件工程学费_为什么我不去软件工程学院
软件学院软件工程学费 The sounds of the keys clicked and clacked as I rushed my fingers across the laptop keybo ...
最新文章
- IPsec ××× 配置實例
- Spark+hadoop+mllib及相关概念与操作笔记
- mysql2阶段提交具体实现_ShardingSphere 4.x 分布式事务之实现原理
- 【ubuntu】ubuntu18.04:在处理时有错误发生:ufw E: Sub-process /usr/bin/dpkg returned an error code (1)
- SpringBoot 2.x 监控中心:Admin
- OGNL表达式struts2标签“%,#,$”
- IE8给你选择的理由
- linux版本 如何查kali_000_Kali Linux版本查看和apt源配置
- 进栈顺序为abcd则出栈顺序为_进栈顺序为a、b、c、d,则出栈顺序可以为?
- [转]Android学习系列(1)--为App签名(为apk签名)
- 重读博弈论(八)---海萨尼转换与贝叶斯法则
- 刚刚!中科院主导的国产编程语言木兰负责人回应了!承认32位机器上,是基于Python二次开发!...
- 修改tomcat浏览器地址栏图标
- 推荐一个小工具 -- 微信QQ防撤回
- Python自动化下载模块
- 2021-07-15-2021年全球10大最佳单板计算机开发板(SBC)(第1-3名)
- matlab小船渡河物理模型,高中物理 | 小船渡河模型和斜拉船模型
- HDU-5868-Different Circle Permutation(快速幂求fib,单数欧拉函数(1e9规模),oeis)...
- Java虚拟机-JVM
- JVM知识点整理2——(类加载)