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】协议,转载请保留原文出处及本版权声明。











 
    
评论