[解決済み] 動的計画法を用いてコイン列の問題を解くには?
2022-02-07 09:47:21
質問内容
コイン列問題:ある正の整数C0, C2, ... を値とするn枚のコインの列がある。Cn-1であり,必ずしも異なるとは限らない.目標は,最初の列で隣り合っている2枚のコインを拾うことができないという制約のもとで, 最大限の金額を拾い集めることである.
下のコードで、nは配列Cのサイズ(またはコインの数)です。このコードは、値[10, 2, 4, 6, 3, 9, 5]に対して正しい結果を返しました(正しい結果は25です)。しかし、同じコードを値 [3, 12, 10] または [3, 12, 10, 2] に対して実行すると、間違った結果が返されました。(一連の値に対して、結果はそれぞれ13と14であるべきです)。
私のコードを修正するのを手伝ってください。
int max(int a, int b) {
if(a > b) return a;
return b;
}
int coin_row(int[] C, int n) {
if(n==1) return C[0];
if(n==2) return max(C[0],C[1];
int F[n], i;
F[0] = 0; F[1] = C[0];
for(i = 2;i < n;i++) {
F[i] = max(C[i] + F[i-2], F[i-1]);
}
return F[n-1];
}
解決方法は?
アルゴリズムは正しいのですが、実装にいくつかバグがあります。 i=2 からループを開始しているので、C[1]の値をスキップしています。 F配列に0枚のコインケースを入れているので、F[n]が存在するためにはn+1のサイズが必要です。以上の修正で、次のようになります。
int max(int a, int b) {
if(a > b) return a;
return b;
}
int coin_row(int* C, int n) {
if(n==1) return C[0];
if(n==2) return max(C[0],C[1]);
int F[n+1], i;
F[0] = 0; F[1] = C[0];
for(i = 2 ; i <= n + 1 ; i++) {
F[i] = max(C[i-1] + F[i-2], F[i-1]);
}
return F[n];
}
関連
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み] struct has no member named
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】malloc():メモリ破壊
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言