動態規劃專欄 四 路徑問題

2021-10-08 06:39:07 字數 2281 閱讀 7000

給定三個字串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。

示例 1:

輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbcbcac」

輸出: true

示例 2:

輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbbaccc」

輸出: false

就字面意思理解,其實很簡單,這裡想講的是關於它的擴充套件。

我們可以這樣理解,s1和s2中的每個字元都代表乙個動作,每個動作會產生乙個與之匹配的唯一的狀態,那麼原背景就可以理解成,在保證s1和s2中各自動作的相對順序不變的情況下,是否可以達到s3的狀態。這樣以拓展,原本簡單的字串問題,就可以建模成乙個複雜的路徑問題。為什麼要將之稱為路徑問題呢,這是我自己起的,就好像每一步都會到乙個新的座標一樣。

有序的狀態問題,都可以通過動態規劃來解決。

首先,什麼問題是有序的狀態問題。如果我這一步的狀態,是被上一步的動作所影響的,並且每個動作與狀態之間存在函式依賴關係,即乙個動作對應乙個唯一的狀態,並且動作執行的相對順序不能被打破,那這就是有序的狀態問題。

動態規劃最核心的問題是狀態轉移方程。

該背景中,倘若給定了二維動態規劃狀態陣列dp,那麼陣列dp[i][j]表示s3中前i+j個字元(包括第i+j)是否是s1中前i個字元(包括第i)和s2中前j個字元(包括第j)交錯組成的,倘若要判斷 dp[i][j] 為真(s3中前i+j個字元能否有s1中前i個字元以及s2中前j個字元組成),有兩種情形:

1)dp[i-1][j]為真 (s3中前i+j-1個字元能否有s1中前i-1個字元以及s2中前j個字元組成),並且s3中往後移動乙個字元即第i+j個字元和s1中往後移動乙個字元即第i個字元相等

2)dp[i][j-1]為真 (s3中前i+j-1個字元能否有s1中前i個字元以及s2中前j-1個字元組成),並且s3中往後移動乙個字元即第i+j個字元和s2中往後移動乙個字元即第j個字元相等

其餘情形一律為假。

注意不要把這裡的第i個第j個和計算機陣列中下標混淆,理解這句話時,不要去想用**如何實現,單純理解文字,將方案定好,模型建立成功以後,將之翻譯成**,切不可想方案的時候考慮實現,否則很容易相互影響。

#include

#include

using

namespace std;

class

solution

//走到此處,s3一定不為空

l3 = s3.

length()

;//如果數量不相等,直接退出

if(l1 + l2 != l3)

return

false

;/*****

初始化dp陣列dp[i][j]表示s3中前i+j個字元(包括第i+j)是否是s1中前

i個字元(包括第i)和s2中前j個字元(包括第j)交錯組成的

****/

/**這裡橫縱都多宣告一行一列,是因為,如果s1或者s2為空,之後**

實現的初始化**中

由於方案中dp[i][j]表示s3中前i+j個字元,那麼最後乙個字元在陣列中

下標未i+j-1,s1中前i個字元最後乙個在陣列中的下標未i-1,s2為j-1

如果出現了s1或s2為乙個字元的情況,宣告的dp陣列,橫縱座標一定會

有乙個為0,

此時如果要表達s3中前1個字元和s1中前1個、s2中前0個,那就是

dp[1][0],但是實際上編譯器生成的dp空間下標是從0到0,這時候就會

崩潰,所以多宣告了乙個空間,來滿足方案的表達意義

dp[i][j]

|0|0|1|2|

|1|-|-|-|

|2|-|-|-|

|3|-|-|-|

**/vectorbool

>>

dp(l1, vector<

bool

>

(l2,

false))

;//s2為空時

for(

int i =

1; i <= l1;

++i)

//s1為空時

for(

int j =

1; j <= l2;

++j)

for(

int32_t i =

1; i <= l1;

++i)}}

return dp[l1]

[l2];}

};

建議測試時多測試邊緣情況,例如s1、s2、s3各自為空的笛卡爾積結果。

題目四 路徑和

給定乙個包含非負整數的 m x n 網格 grid 請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。輸入 grid 1,3,1 1,5,1 4,2,1 輸出 7 override public int minpathsum int grid int ...

7 5路徑尋找問題

路徑尋找問題可以歸結為隱式圖的遍歷,他的任務是找一條從初始狀態到終止狀態的最優路徑,回溯法是找到一些符合要求的解 八數碼問題 分析 把八數碼問題歸結為圖上最短路問題,用bfs求解 include includeusing namespace std typedef int state 9 const...

ROS學習筆記(6) 路徑規劃

全域性路徑規劃 提供dijkstra和a 演算法,預設使用 dijkstra dijkstra 廣度優先,從近到遠遍歷所有點計算一遍,直至計算出最優路徑 偽 獲取起點座標 目標點座標,把起點放進 openlist while openlist 不為空列表 else else else openlis...