2016-12-10 12 views
0

飛行経路を表す一連の座標が与えられた場合、最大距離を見つけることができます(通過するポイント数はnです)。この問題を説明するために、次のように2Dグリッドに飛行経路が表示されます。座標のセットが与えられた場合、最大距離を見つける(ステップを使用)

Flight Path

ここでは、アルゴリズムがパラメータn(整数)で行うべきことがあります。

Find max distance

質問はすべてのポイントをスキャンし、組み合わせによってすべての距離を試してみて、最終パスの長さを返すことができるアルゴリズムを見つけることです。

/** 
* @return the distance between the two coordinates 
*/ 
public double distance(Coordinate destination) {} 

/** 
* @return the farthest coordinate from start 
*/ 
public Coordinate coordMax() {} 

/** 
* @return max distance using n points 
* I would maybe try to go for a recursive solution 
* and already have the 2 corner cases down. 
*/ 
public double statMaxDistance(int n) { 

    if (n == 0) 
     return coordTable[0].distance(coordTable[coordTable.length - 1]); 
    if (n == 1) 
     return coordTable[0].distance(coordMax()); 

    // TODO recursive step 

    return statMaxDistance(); 
} 

質問は次のとおりです:

は、全体のパスの各点を反復することなく、このタスクを完了するための方法はあります

は、我々はすでに2点の距離を得ることができる方法を持っていますすべての可能な組み合わせを試して、可能な限りすべての距離を計算して、最終的に最も遠い距離になるでしょうか?

経路全体に沿って1または2ポイントしか移動しないようなアプローチには感覚的に思えるかもしれませんが、このようなアルゴリズムは、3+基準ポイントが与えられた最大距離を計算するときに非常に貪欲です。

答えて

0

これは、動的プログラムを使用して解決できます。 D[i][j]は、開始点から最後の点がji番目の中間点まで到達できる最大距離であるとします。ソリューションはD[n][endPoint]になります。

これを解決するにはどうすればよいですか?最初の列D[0][...]は簡単に計算できます。これはちょうど始点とのポイントの距離になります。他の列は少しトリッキーです。前の列のすべてのエントリをチェックする必要があります。最後のポイントは現在のポイントよりも厳密に前です。だから、エントリD[i][j]を計算するために、あなたは計算する必要があります。

D[i][j] = max_{k < j} (D[i - 1][k] + distance(k, j)) 

これが意味:すべての可能なkは、このようなkは(すなわちポイントkが現在のポイントjの前に位置しています)jよりも小さいことを繰り返します。距離がk(これはD[i - 1][k]の部分)までの距離とkからjまでの距離の合計として計算された距離を計算します。これらの値の最大値をD[i][j]に設定します。また、最後にパスを再構築する必要がある場合は、kを追跡することもできます(最大距離に関心があるだけではありません)。有効な解がないセルがある可能性があります(例:D[1][0] - 第2の(1)中間点として0を指すことはできません)。

各列のすべての中間点でこれをD[n - 1][...]まで実行します。最後のステップは、D[n][endPoint]の場合にもう一度このプロセスを実行することです。厳密に言えば、D配列に配置する必要はありません(列全体ではなく、単一の値だけに興味があるからです)。

この値を計算したら、それがあなたの解決策です。実際のパスを探したい場合は、すべてのセルに保存されているkの値を使用してバックトラックする必要があります。

関連する問題