首页 > 其他分享 >Codeforces 293B Distinct Paths

Codeforces 293B Distinct Paths

时间:2023-07-03 21:00:36浏览次数:36  
标签:Paths cnt Distinct Codeforces ret int 293B

发现 \(n, m\) 的数据范围是假的,因为每一步一个颜色最多也就 \(k\le 10\) 种颜色,所以当 \(n + m - 1 > k\) 时一定无解。

接下来发现这个数据范围挺小的,考虑状压,设 \(f_{x, y}\) 为走到 \((x, y)\) 点所用的颜色的集合,其可以由 \(f_{x - 1, y}, f_{x, y - 1}\) 推来。
然后就可以枚举还未选过的颜色,选一个填到 \((x, y)\),同时更新 \(f_{x, y}\),因为多用了一个颜色,然后继续往后推一步步得到答案,推的顺序可以一行一行推。

这样朴素的搜索肯定是过不了的,考虑优化:

  • 若 \(k - \operatorname{popcount}(f_{x, y})<(n - x) + (m - y) + 1\)(此时 \((x, y)\) 还没有选颜色,\(\operatorname{popcount(x)}\) 代表 \(x\) 二进制下 \(1\) 的个数),即剩余的颜色已经不足以继续填到终点,方案数肯定为 \(0\)。
  • 若在同一方格的染色过程中,\(a, b\) 两种颜色都是第一次在图中出现,那么 \(a,b\) 对应的贡献一定是相同的,所以对于只需算出 \(a\) 的贡献 \(ret\),\(b\) 的贡献也为 \(ret\) 不用再次计算。
// lhzawa(https://www.cnblogs.com/lhzawa/)
// Problem: B. Distinct Paths
// Contest: Codeforces - Croc Champ 2013 - Round 2
// URL: https://codeforces.com/problemset/problem/293/B
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
const int N = 10 + 5;
int n, m, k;
int col[N][N], f[N][N];
int ud[N];
const int mod = 1e9 + 7;
int dfs(int x, int y) {
	if (y > m) {
		x++, y = 1;
	}
	if (x > n) {
		return 1;
	}
	int s = f[x - 1][y] | f[x][y - 1];
	int cnt = k;
	for (int i = 1; i <= k; i++) {
		if ((s >> (i - 1)) & 1) {
			cnt--;
		}
	}
	if (cnt < (n - x) + (m - y) + 1) {
		return 0;
	}
	int ret = -1, ans = 0;
	for (int i = 1; i <= k; i++) {
		if ((col[x][y] && col[x][y] != i) || ((s >> (i - 1)) & 1)) {
			continue;
		}
		f[x][y] = s | (1 << (i - 1));
		if (! ud[i]) {
			ud[i] = 1;
			if (ret == -1) {
				ret = dfs(x, y + 1);
			}
			ans = (ans + ret) % mod;
			ud[i] = 0;
		}
		else {
			ans = (ans + dfs(x, y + 1)) % mod;
		}
	}
	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", &col[i][j]);
			ud[col[i][j]] = 1;
		}
	}
	printf("%d\n", dfs(1, 1));
	return 0;
}

标签:Paths,cnt,Distinct,Codeforces,ret,int,293B
From: https://www.cnblogs.com/lhzawa/p/17524029.html

相关文章

  • 100W数据去重,用distinct还是group by
    京东太狠:100W数据去重,用distinct还是groupby,说说理由?原创 40岁老架构师尼恩 技术自由圈 2023-06-0411:37 发表于广东收录于合集#面试题86个技术自由圈疯狂创客圈(技术自由架构圈):一个技术狂人、技术大神、高性能发烧友圈子。圈内一大波顶级高手、架构师、......
  • DistinctAdjacent
    [ABC307E]DistinctAdjacent解答1:我们将圆环上有\(i\)个人的情况的答案记为\(f(i)\)。考虑有\(i+1\)个人排成一排的情况,此时答案为\(M\times(M-1)^i\)。这样的传递方式中,如果是圆环的情况且不满足条件的传递方式只有人\(i+1\)和人\(1\)的情况不同。因此,这两个人可......
  • SQL中的distinct的使用方法
    1.distinct含义与使用方法distinct用来查询不重复记录的条数,即用distinct来返回不重复字段的条数(count(distinctid)),其原因是distinct只能返回他的目标字段,而无法返回其他字段。注意事项distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;只能在SELECT语句中使......
  • MySQL 8 如何解决快速获取数据库中所有业务库表列的distinct 值,不使用SQL
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近我们接到一个需求,在数据库内,无准确目标的寻找每个表中的字里面包含某些特殊字符的列。工作了快半辈子了,也是第一次听说这样......
  • 解决find命令报错: paths must precede expression
    解决find命令报错:pathsmustprecedeexpression 在一天早上,想在服务器/tmp目录清除一些pdf文件,大概一万多个文件,在执行命令的时候find/tmp-maxdepth1-mtime30-name*.pdf出现了错误:find:pathsmustprecedeexpressionUsage:find[-H][-L][-P][......
  • P2860 [USACO06JAN]Redundant Paths G 题解 tarjan边双连通分量
    题目链接:https://www.luogu.com.cn/problem/P2860题目大意:给定一个无向连通图,求至少加几条边,能使其变成一个边双连通图。解题思路:边双连通分量缩点后计算度数为\(1\)的节点个数,假设有\(cnt\)个,则答案为\((cnt+1)/2\)。示例程序:#include<bits/stdc++.h>usingnamespacestd;......
  • CF1205C Palindromic Paths 题解
    很好的一道题,思路自然,步骤清晰,结论好猜。唯一的缺点可能只是我赛时没有看到。构造可行解看到题目,也许我们很快就能想出一个做法:每次询问\((i,j,i+1,j)\),每行第一个额外询问\((i,j,i+1,j)\),这样询问总共\(n^2-1\)次即可。当我们怀疑看错题目重新检查时发现了被微软翻译......
  • P2860 [USACO06JAN]Redundant Paths G 题解 ratjan边双连通分量
    题目链接:https://www.luogu.com.cn/problem/P2860题目大意:给定一个无向连通图,求至少加几条边,能使其变成一个边双连通图。解题思路:边双连通分量缩点后计算度数为\(1\)的节点个数,假设有\(cnt\)个,则答案为\((cnt+1)/2\)。示例程序:#include<bits/stdc++.h>usingnamespac......
  • base_path base_paths_win.cc
    //Copyright(c)2012TheChromiumAuthors.Allrightsreserved.//UseofthissourcecodeisgovernedbyaBSD-stylelicensethatcanbe//foundintheLICENSEfile.#ifndefBASE_BASE_PATHS_H_#defineBASE_BASE_PATHS_H_//Thisfiledeclarespathkey......
  • 京东太狠:100W数据去重,用distinct还是group by,说说理由?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......