演算法導論 動態規劃中一道習題的實現

2021-05-27 16:57:01 字數 1528 閱讀 7468

這幾日正好在看《演算法導論》,對其中的一道習題做了c實現,題目詳見220頁,第15-6題。

動態規劃的基本思想就是降低問題的規模,通過迭代或者遞迴的方式求解子問題,自底向上推出目標結果。

cipher感覺動態規劃就是遵守問題約束的窮舉,計算規模自然比較小。

基本思路就是:

m[ i, j ] = p( i, j ) + max( m[ i - 1, j - 1 ], m[ i - 1, j ], m[ i -1, j + 1 ] )
m表示每走一步的獲利, p表示每個格仔的利潤(實現中隨機生成),m[ i, j ]可能來自於他的左下方、下放和右下方中最大的乙個。

下面給出**,定義了乙個6*6的棋盤:

#include #include #include #define n 6

using namespace std;

// 遞迴獲得路徑

void reprintpath( char path[ n ], int i, int j )

else

}// 迭代獲得路徑

void printpath( char path[ n ], int i, int j )

if( path[ i ][ j ] == 'r' )

} cout << "path " << i + 1 << " ( " << i + 1 << ", " << j << " )" << endl;

}int main()

} // 初始化path陣列,該陣列用來獲得路徑

for( int i = 0; i != n - 1; ++ i )

} for( int i = 0; i != n; ++ i )

cout << endl;

} // 迴圈從1開始,第一行不做考慮

for( int i = 1; i != n; ++ i ) else

// 第2到n-2列有三種情況

for( int j = 1; j != n - 1; ++ j ) else

if( tempvalue >= board[ i - 1 ][ j + 1 ] ) else

}// n-1列的兩種情況

if( board[ i - 1 ][ n - 1 ] >= board[ i - 1 ][ n - 2 ] ) else

} for( int i = 0; i != n; ++ i )

cout << endl;

} for( int i = 0; i != n - 1; ++ i )

cout << endl;

} tempvalue = 0;

for( int i = 0; i != n; ++ i )

} printpath( path, 4, flag );

reprintpath( path, 4, flag );

cout << "the bigest one -> " << flag << endl;

}

一道簡單的動態規劃

這是一道usaco的題,section 3.4 raucous rockets 如果只有1張唱片,就是乙個揹包問題,現在有m張唱片,怎麼辦呢?dp i j k 表示前i首歌曲在j個cd中最後乙個cd時間為k的最大值 如果這首歌不選,就是dp i 1 j k 如果選,可以在當前時間就選,就是dp i ...

《演算法導論》筆記(9) 動態規劃 部分習題

一些本章的習題的解法簡答及偽碼。15.1 5 斐波那契數的子問題圖。每個斐波那契數與前兩個斐波那契數有關。所以有n個頂點,2 n 2 條邊。15.2 4 矩陣鏈乘法的子問題圖。n個矩陣的子問題是n 1對,所以共有 n 1 n 2與n n 1 n 2 2條邊。15.3 6 外幣兌換問題。必須是不重複的...

一道動態規劃水題的思考

最近感覺自己太菜了,想做一道水題找找自信,結果越發自卑qwq 洛谷p1002過河卒 這道題目的空間一維優化我居然看了半天才看懂 其實主要是那個作者沒有講清楚,讓我迷糊了半天,下面我來談談我對於這個狀態轉移方程的理解吧.對於沒有更新的狀態,它裡面存的值對應於二維陣列中 原作者的描述確實讓人看著有點迷q...