以下问题的伪代码或逻辑是什么?最终的方法是找到动态编程解决方案

问题描述

让P [1··m]和Q [1··n]是平面上的两个点序列。想象一下,用绳子相互连接的两只青蛙Pfrog和Qfrog想要一起遍历这些序列。最初,Pfrog在P 1,而Qfrog在Q 1。在每个步骤中,如果Pfrog在P [i]且Qfrog在Q [j],则它们可以以三种不同的方式进行:(A)Pfrog向前跳到P [i + 1],而Qfrog停留在Q [ j],(B)Qfrog向前跳到Q [j +1],而Pfrog停留在P [i],或(C)Pfrog和Qfrog一起向前跳到P [i + 1]和Q [j +1] , 分别。 (请注意,青蛙永远不会向后跳。)考虑一条长度为L的绳索。如果存在P和Q的穿越,使得Pfrog和Qfrog始终≤L,则说这条绳索很有用。您的工作是确定最小的有用整数绳索长度。 (因为更长的绳索要花更多的钱。)

Figure 1

图1:Pfrog和Qfrog的有效移动顺序为(P 1,Q 1)→(P [2],Q 1)→(P [3 ],Q 1)→(P [4],Q [2])→(P [5],Q [3])→(P [5],Q [4])→(P [5 ],Q [5])→(P [5],Q [6])。

解决方法

天真的重复只需要考虑O(|P| * |Q|)个状态的先前可能状态:

f(1,1) ->
  dist(P[1],Q[1]);
  
f(1,j) ->
  max(f(1,j-1),dist(P[1],Q[j]));
  
f(i,1) ->
  max(f(i-1,1),dist(P[i],Q[1]));
  
f(i,j) ->
  max(
    dist(P[i],Q[j]),min(
      f(i-1,f(i,f(i-1,j)
    )
  ).