我在动态编程方面遇到了困难,我是新手,所以我希望你能帮助我做任何事情,问题是:
作为IKS B'Moth Klingon战列巡洋舰的通讯官,您的职责是以最有效的方式管理通讯。假设您需要发送一个消息S = s1 ... sm作为m个符号的字符串给出。为此,您有不同的代码。设b(ij)是在第j个代码中包含消息的第i个符号所需的位数。最初,桥接发送器设置为代码#1,但您可以在消息中的任何位置自由更改代码,并根据需要自由更改代码。为此,如果要从当前代码i切换到任何其他代码j,则需要发送由C(ij)位组成的控制代码。您的目标是确定如何以最有效的方式发送消息(使用最少的位数)。
A)证明问题表现出最佳的子结构。
B)找到所需最佳位数的重复。
C)构建一个自下而上的动态编程算法来解决问题并指出其复杂性。
答案 0 :(得分:0)
您可以制作三维数组,并使用previousCode
,newCode
和ithSymbol
作为索引。在扫描到ithSymbol
时以及将代码从previousCode
切换到newCode
时,阵列将存储最少的位数。
递归公式为:
dp(ithSymbol, previousCode, newCode)=min_(i=1 to r)(dp(ithSymbol-1,i,previousCode))+C(previousCode, newCode)+b(ithSymbol,newCode);
(假设,所有i的C(i,i)= 0)
现在您可以自己编写代码了。
N.B。这是一种天真的方法。您可以通过使阵列2-D在任何步骤中仅使用ithSymbol-1
来进一步提高效率。