我有一个细胞塔问题。有n个城镇。我们想在一些城镇建造手机楼。每个蜂窝塔都可以覆盖自己及其邻居。每个城镇都有建造蜂窝塔的费用。我们想要找出建造蜂窝塔以覆盖所有城镇的最低成本。
例如,
(1)
费用5 1 2 我们选择在城镇2建造蜂窝塔。费用是1.
(2)
费用5 1 2 3 我们选择在镇2/3建造蜂窝塔。费用是1 + 2 = 3.
(3)
费用5 1 3 2
我们选择在城镇2/4建造蜂窝塔。费用是1 + 2 = 3.
这是一种动态编程算法。我该如何解决?
由于 灵
答案 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。