动态规划解决排列问题

时间:2017-04-14 07:24:12

标签: algorithm dynamic-programming memoization

我有四位数,“1”,“2”,“3”,“4”。

程序的输入是一个整数,只能包含上述4位数字。会有很多投入。

输入示例:1123,4123,4444

我需要计算符合以下规则的给定输入的排列数:

  1. 两个相似的数字之间不应相邻。示例:不允许使用1223,但允许使用2123。
  2. 起始端结束数字不应相同。它们被认为是圆形相邻的。示例:不允许2132。
  3. 如果输入的长度为4位,则结果排列也应为4位长。
  4. 我可以使用任何类型的memoization来解决这个问题吗?我如何将其存储在二维阵列中?请给小费谢谢!

1 个答案:

答案 0 :(得分:2)

由于您只对允许的排列数量感兴趣,因此大多数输入会产生相同的结果。

  • 输入中数字的顺序无关紧要
  • 只有数字的频率分布很重要,即1123和1223导致相同的答案。

根据数字频率对输入进行分类导致4位输入只有5种不同的情况:

class     examples
4         4444, 2222, ...
3 1       1211, 2232, ...
2 2       1331, 4422, ...
2 1 1     3413, 1123, ...
1 1 1 1   1234, 4231, ...

一旦你找到了每个案例的答案,就可以非常快速地处理任何新的输入。