私はプログラミングフォーラムでこの質問を見つけました:
それぞれ一定量のリンゴを含むN*M細胞で構成される表が示されています。左上隅から始めます。各ステップで、1つのセルを下または右に移動できます。左上隅から右下隅に移動する場合は、収集できるリンゴの最大数を見つけるためのアルゴリズムを設計します。
私は3つの異なる複雑さを考えました[時間と空間の観点から]:
アプローチ1[最速]:
for(j=1,i=0;j<column;j++)
apple[i][j]=apple[i][j-1]+apple[i][j];
for(i=1,j=0;i<row;i++)
apple[i][j]=apple[i-1][j]+apple[i][j];
for(i=1;i<row;i++)
{
for(j=1;j<column;j++)
{
if(apple[i][j-1]>=apple[i-1][j])
apple[i][j]=apple[i][j]+apple[i][j-1];
else
apple[i][j]=apple[i][j]+apple[i-1][j];
}
}
printf("\n maximum apple u can pick=%d",apple[row-1][column-1]);
アプローチ2:
結果は、最初はすべてのスロットが0である一時アレイです。
int getMax(int i, int j)
{
if( (i<ROW) && (j<COL) )
{
if( result[i][j] != 0 )
return result[i][j];
else
{
int right = getMax(i, j+1);
int down = getMax(i+1, j);
result[i][j] = ( (right>down) ? right : down )+apples[i][j];
return result[i][j];
}
}
else
return 0;
}
アプローチ3[使用される最小スペース]:
一時配列は使用しません。
int getMax(int i, int j)
{
if( (i<M) && (j<N) )
{
int right = getMax(i, j+1);
int down = getMax(i+1, j);
return apples[i][j]+(right>down?right:down);
}
else
return 0;
}
この問題を解決するための最良の方法を知りたいですか?