2023-07-09:给定 N、M 两个参数, 一共有 N 个格子,每个格子可以涂上一种颜色,颜色在 M 种里选, 当涂满 N 个格子,并且 M 种颜色都使用了,叫一种有效方法。 求一共有多少种有效方法。 1 <= N,
2023-07-09:给定 N、M 两个参数,
一共有 N 个格子,每个格子可以涂上一种颜色,颜色在 M 种里选,
当涂满 N 个格子,并且 M 种颜色都使用了,叫一种有效方法。
求一共有多少种有效方法。
1 <= N, M <= 5000。
返回结果比较大,请把结果 % 1000000007 之后返回。
答案 2023-07-09:
这两种算法用于计算涂色的有效方法总数。
算法 ways1
:
1.初始化路径数组 path
,颜色是否使用的数组 set
。
2.调用 process
函数,传入初始参数:路径数组 path
,颜色是否使用的数组 set
,当前处理的位置 i
,格子数量 n
,颜色种类 m
。
3.如果当前位置 i
等于格子数量 n
,即路径数组 path
已填满:
将颜色是否使用的数组
set
中所有元素重置为false
。统计路径数组
path
中不重复的颜色数量,并记录在colors
中。如果
colors
等于颜色种类m
,说明此路径是有效方法,返回 1;否则返回 0。
4.否则,遍历颜色种类 m
的所有可能颜色:
在路径数组
path
当前位置i
处填入该颜色。调用
process
函数递归处理下一个位置i+1
。将返回的结果累加到
ans
上。
5.返回最终的结果 ans
。
算法 ways2
:
1.初始化动态规划数组 dp
,大小为 MAXN × MAXN
。
2.对于 dp
数组的第一行,设置每个位置的值为颜色种类 m
。
3.使用两层循环,从第二行开始,依次计算每个位置 dp[i][j]
的值:
dp[i][j]
等于前一行dp[i-1][j]
乘以颜色种类j
取模mod
。添加额外的项,
dp[i][j]
等于前一行dp[i-1][j-1]
乘以剩余颜色种类m-j+1
,然后加上之前的结果,再取模mod
。
4.返回 dp[n][m]
的结果作为最终的答案。
功能测试:逐个测试从 1 到 9 的格子数量和颜色种类的组合,比较两种算法的结果是否一致,如果不一致则输出错误信息并中断。
性能测试:以 N=5000、M=4877 为例,计算两种算法的运行时间并打印结果。
算法 ways1
的时间复杂度为 O(m^n),空间复杂度为 O(n)。
算法 ways2
的时间复杂度为 O(nm),空间复杂度为 O(nm)。
go 完整代码如下:
rust 完整代码如下:
c++完整代码如下:
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/73ea092b66f1010d3b1ce0a5d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论