注:2019-09-13,mooc北大程式設計與演算法第六周,動態規劃2
不建議新手看我的c++ 版本,怕誤導人…
1最長上公升子串行問題【回顧複習】
1:maxlen[n],狀態陣列,最終會記錄最長上公升子串行的數值
int main()
cout << "輸入完畢,開始計算 .\n";
for (int i = 1; i < n; i++)
for (int k = 0; k < i, k++)
if len1[k] < len1[i]
maxlen[i] = max(maxlen[i], maxlen[k]) + 1;
return 0;
}
一年半之前剛學程式語言碰上遞迴,到4399玩了半小時漢諾塔才通關。到現在這麼長時間過去了。遞迴主要是表述想法的時候比較簡便,真正理解後其實也很好懂,但是實際應用還是遞推。
2,最長公共子串行
給定兩個字串,找到共有的兩個最長排列字元
例如 「abcdgfr」和 「acklrdg」 就是 「acdg」 輸出值為4
沒看課程,自己先想了一會,這個狀態構造沒想出來。。。有點菜
主要碰到遍歷問題,卻沒想到用二維陣列來解決
解決方案:
1,狀態構建: 二維陣列(方陣)total,長度為最大的字串長度
2,狀態轉移:田字格,右下角與其他三格之間的轉換,注意轉換只能是相鄰之間,我之前想的用一位陣列就是遇到了這個問題,無法進行轉換
python:
import numpy as np
strx = ['abcdgrf', 'acklrdg']
len1 = len(strx[0])
len2 = len(strx[1])
matrix = np.zeros(len1+1, len2+1])
matrix = matrix.astype(np.int8).tolist()
for i in range(1, len1+1):
for k in range(1, len2+1):
if strx[0][i-1] == strx[1][k-1]:
matrix[i][k] = matrix[i-1][k-1] + 1
else:
matrix[i][k] = max(matrix[i][k-1], matrix[i-1][k]
print(matrix[len1][len2])
c++
本想用中文字串,但似乎c++ 遍歷中文字串不太ok,畢竟還是初學,暫時用字母吧:
#include #include #include using namespace std;
int main()
總結
動態規劃問題核心就是 1 問題拆解 2,狀態構建 3,狀態轉移
演算法與資料結構 動態規劃
動態規劃 dp 的基本思想是 當前子問題的解可由上一子問題的解得出。動態規劃演算法通常基於由乙個遞推公式 狀態轉移方程 和若干個初始狀態 狀態 應用 1 lis longest increasing subsequence 求乙個陣列中的最長非降子串行的長度。子問題 我們可以考慮先求a 0 a 1 ...
演算法與資料結構 動態規劃
用遞迴求解問題時,反覆的巢狀會浪費記憶體。而且更重要的一點是,之前計算的結果無法有效儲存,下一次碰到同乙個問題時還需要再計算一次。例如遞迴求解 fibonacci 數列,假設求第 n 位 從 1 開始 的值,c 如下 include intfib int n return fib n 1 fib n...
資料結構與演算法練習 動態規劃
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...