动态编程:Timus Online Judge 1172 Ship Routes

时间:2014-04-02 04:41:30

标签: algorithm dynamic-programming

我长期以来一直坚持这个问题。它必须具有动态编程解决方案,因为它已被标记为"动态编程"。请提出一个方法。

  

Question Link

含糊不清的问题陈述:

  

每个岛上有3个岛屿有N个城市。从岛上的每个城市到另一个岛上的每个城市都有一条路径,即。连接同一个岛上的城市没有路径。查找访问所有3 * N个城市的方式。请注意,如果3 * N城市的连续相同或第一次旅行的3 * N城市的连续与第2次旅行的3 * N城市的连续相同,则2次旅行是相同的,向后阅读(例如,如果每个岛屿有一个城市,根据岛屿的编号编号,1-2-3-1和1-3-2-1的旅行将是相同的。)

约束:

  

1≤N≤30

示例输入/输出:

  

对于N = 2,答案= 16。

1 个答案:

答案 0 :(得分:2)

这只是我的想法:

首先,如果我们能解决两个子问题,我们可以解决问题

  • 假设您需要生成长度为3 * N的字符串仅从1,2或3 ,计算我们可以创建此字符串的方式,条件是是连续2次出现为1,2或3,对于每种类型的字符,字符串中应该有N个。您可以使用DP

  • 解决此问题
  • 其次,从创建的所有字符串中删除第一个字符,因为字符串可以向前和向后同等读取,因此每个字符串将被计数两次,除了回文 。所以,我们需要计算那些3 * N - 1弦的回文数。这可以通过DP

  • 来解决

而且,现在,我们可以将字符串中的1,2或3的每个位置替换为岛1,2或3中的一个城市,并且每个字符串都有(N!)^ 3方式来做,并且我们有答案