动态编程(如何以最有效的方式发送消息)

时间:2017-06-02 04:27:21

标签: java

我在动态编程方面遇到了困难,我是新手,所以我希望你能帮助我做任何事情,问题是:

作为IKS B'Moth Klingon战列巡洋舰的通讯官,您的职责是以最有效的方式管理通讯。假设您需要发送一个消息S = s1 ... sm作为m个符号的字符串给出。为此,您有不同的代码。设b(ij)是在第j个代码中包含消息的第i个符号所需的位数。最初,桥接发送器设置为代码#1,但您可以在消息中的任何位置自由更改代码,并根据需要自由更改代码。为此,如果要从当前代码i切换到任何其他代码j,则需要发送由C(ij)位组成的控制代码。您的目标是确定如何以最有效的方式发送消息(使用最少的位数)。

A)证明问题表现出最佳的子结构。

B)找到所需最佳位数的重复。

C)构建一个自下而上的动态编程算法来解决问题并指出其复杂性。

1 个答案:

答案 0 :(得分:0)

您可以制作三维数组,并使用previousCodenewCodeithSymbol作为索引。在扫描到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来进一步提高效率。