最低成本的动态编程问题

时间:2013-08-09 23:29:55

标签: algorithm

我有一个细胞塔问题。有n个城镇。我们想在一些城镇建造手机楼。每个蜂窝塔都可以覆盖自己及其邻居。每个城镇都有建造蜂窝塔的费用。我们想要找出建造蜂窝塔以覆盖所有城镇的最低成本。

例如,

(1)

TOWN 1 2 3

费用5 1 2 我们选择在城镇2建造蜂窝塔。费用是1.

(2)

TOWN 1 2 3 4

费用5 1 2 3 我们选择在镇2/3建造蜂窝塔。费用是1 + 2 = 3.

(3)

TOWN 1 2 3 4

费用5 1 3 2

我们选择在城镇2/4建造蜂窝塔。费用是1 + 2 = 3.

这是一种动态编程算法。我该如何解决?

由于 灵

1 个答案:

答案 0 :(得分:1)

我会选择以下几行:

f(0,_) = 0
f(1,true) = 0
f(1,false) = cost[1]
f(x,true) = min{ f(x-1,true) + cost[x], f(x-1,false) }
f(x,false) = min { f(x-1,true) + cost[x], f(x-2,true) + cost[x-1]}

这个想法是:

x是我们正在查看的当前城市数量,如果此城市已被覆盖(左侧是城市),则布尔值为true。

  • f(0,_)是一个空基础子句 - 它可以免费提供任何内容。
  • f(1,false)是未覆盖城市1的基地,因此您必须在那里放置一座塔,而f(1,true)是覆盖城市1的基地,因此您不需要塔楼和您完成了。
  • f(x,true)是城市x已经被覆盖的情况,所以你可以在那里放一座塔,并继续前往下一个城市[也被覆盖 - f(x-1,true)],或者不要把塔放在那里,下一个城市没有被覆盖[f(x-1,false)]
  • f(x,false)是未覆盖城市x的情况,因此您基本上有两个选择,或者在其中放置一个塔,然后继续f(x-1,true)。或者将一座塔放在下一个城市(在x-1中),然后继续f(x-2,true)

f(x,false)开始,其中x是最后一个城市,您将获得最小的解决方案。
很容易看出这个递归公式可以很容易地修改为DP。