1. 定義
貪欲アルゴリズムは、次のように定義されます。大きな問題をいくつかの小さな問題に分解し、問題を解決する各ステップで、このステップでの現在の決定が将来にどのような影響を与えるかに関係なく、当面の決定のみが最適です。これを繰り返し、最終的に最適解が得られます。
欠点:最適解を求めたいだけであり、各ステップでは最適解であっても、全体としては最適解が得られない可能性がある。
利点: 通常、時間の複雑さは比較的低い、つまり、所要時間が短くなります。全体としては最高ではないかもしれませんが、10 に近いものでもあります。
2、例
以下の図に示すように、ピラミッドに従って配置された多数の数値があります。頂点から開始して、上から下までの最大パスの合計を見つけます。言い換えれば、各レイヤーに上から下まで数値を追加して、この数値を最大にします。
目で見ると、9-7-3-4-5 が最適なパスであることが簡単にわかりますが、数えすぎるとうまく機能せず、コードに依存する必要があります。それを計算してください。
考えられるすべての可能性を計算して総当たりで実行するソリューションがあり、これも簡単に作成できます。しかし、明らかにこれは非常に時間とメモリを消費し、コンピュータは毎分スタックしてしまうため、ここでは貪欲なアルゴリズムを使用します。
3. コード
このピラミッド配列を a[i][j] として表すと、次のようにコードを記述するだけです。
// 注意,下面的代码只是表意,不能直接扒过去用
// a[i][j]表示数组,maxJ表示数组的最大层数,temp表示临时数值
// maxJ表示总列数,maxI表示当前列的最大行数
for(j=0; j<maxJ; j++){
for(i=0; i<maxI; i++){
temp1 = a[i][j] + a[i][j+1];
temp2 = a[i][j] + a[i+1][j+1];
temp = max(temp1, temp2);
}
maxSum = maxSum + temp;
}
return maxSum;