動態規劃 資料結構與演算法筆記3

2021-09-27 02:40:24 字數 1435 閱讀 3326

注: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個開始,到第...