二 演算法之始 動態規劃

2021-10-05 10:53:49 字數 2201 閱讀 7961

一切演算法理論都是為了解決實際問題,直接講解演算法理論很難理解, 我們結合實際問題來深刻理解動態規劃的奇妙。

題目:給定乙個字串s,找到s最長的回文子串。你可以假設s的最大長度為 1000。

示例1:

輸入: "babad"

輸出: "bab"

注意: "aba" 也是乙個有效答案。

示例2:

輸入: "cbbd"

輸出: "bb"

解題思路:本題最容易想到的一種方法應該就是中心擴散法

中心擴散法怎麼去找回文串?

從每乙個位置出發,向兩邊擴散即可。遇到不是回文的時候結束。舉個例子,str = acdbbdaastr=acdbbdaa 我們需要尋找從第乙個 b(位置為 33)出發最長回文串為多少。怎麼尋找?

首先往左尋找與當期位置相同的字元,直到遇到不相等為止。

然後往右尋找與當期位置相同的字元,直到遇到不相等為止。

最後左右雙向擴散,直到左和右不相等。如下圖所示:

每個位置向兩邊擴散都會出現乙個視窗大小(len)。如果 len>maxlen(用來表示最長回文串的長度)。則更新 maxlen 的值。

因為我們最後要返回的是具體子串,而不是長度,因此,還需要記錄一下 maxlen 時的起始位置(maxstart),即此時還要 maxstart=len。

public string longestpalindrome1(string s) 

int strlen = s.length();

int left = 0;

int right = 0;

int len = 1;

int maxstart = 0;

int maxlen = 0;

for (int i = 0; i < strlen; i++)

while (right < strlen && s.charat(right) == s.charat(i))

while (left >= 0 && right < strlen && s.charat(right) == s.charat(left))

if (len > maxlen)

len = 1;

}return s.substring(maxstart + 1, maxstart + maxlen + 1);

}

優化:

中心擴散的方法,其實做了很多重複計算。動態規劃就是為了減少重複計算的問題。動態規劃聽起來很高大上。其實說白了就是空間換時間,將計算結果暫存起來,避免重複計算。作用和工程中用 redis 做快取有異曲同工之妙。

我們用乙個 boolean dp[l][r] 表示字串從 i 到 j 這段是否為回文。試想如果 dp[l][r]=true,我們要判斷 dp[l-1][r+1] 是否為回文。只需要判斷字串在(l-1)和(r+1)兩個位置是否為相同的字元,是不是減少了很多重複計算。

進入正題,動態規劃關鍵是找到初始狀態狀態轉移方程

初始狀態,l=r 時,此時 dp[l][r]=true。

狀態轉移方程,dp[l][r]=true 並且(l-1)和(r+1)兩個位置為相同的字元,此時 dp[l-1][r+1]=true。

public string longestpalindrome(string s) 

int strlen = s.length();

int maxstart = 0; //最長回文串的起點

int maxend = 0; //最長回文串的終點

int maxlen = 1; //最長回文串的長度

boolean dp = new boolean[strlen][strlen];

for (int r = 1; r < strlen; r++) }}

}return s.substring(maxstart, maxend + 1);

}

動態規劃演算法(二)

繼續以例題如入手,不是解題,而是學習動態規劃 題目描述 給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。說明 拆分時可以重複使用字典中的單詞。你可以假設字典中沒有重複的單詞。示例 1 輸入 s leetcode word...

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...