演算法Day09 動態規劃之最長遞增子串行

2021-10-24 03:56:16 字數 2497 閱讀 3475

注意:子串行和子串之間的區別

最長遞增子串行lis問題:

定義:dp[

i]

dp[i]

dp[i

] 表示以 num

s[i]

nums[i]

nums[i

] 這個數結尾的最長遞增子串行的長度

根據定義,可知最終結果的子串行的最大長度就是dp陣列中的最大值

int res =0;

for(

int i =

0; i < dp.

size()

; i ++

)return res;

for

(int j =

0; j < i, j++

)}

for

(int i =

0; i < nums.length; i++)}

}

最長遞增子串行完整**:
public int

lengthoflis()

}}int res =0;

for(

int i =

0; i < dp.

length()

; i++

)return res;

}

然後根據dp陣列的定義,計算出 dp[

i]

dp[i]

dp[i

]

最後確定問題的base case

按照上述規則,可以算出最長遞增子串行,牌堆數就是最長遞增子串行的長度

二分查詢演算法求解最長遞增子串行:

public int

lengthoflis

(int

nums)

else

if(top[mid]

< poker)

else

}// 沒有找到合適的牌堆則新建乙個牌堆

if(left == piles)

// 選擇最左邊的牌堆放置

top[left]

= piles;

}// 牌堆數就是最長遞增子串的長度

return piles;

}

動態規劃設計方法:

def

lengthoflis

(self, nums : list[

int])-

>

int:

n =len(nums)

dp =[1

for x in

range(0

, n)

]for i in

range(0

, n)

:for j in

range(0

, i)

:if nums[i]

> num[j]

: dp[i]

=max

(dp[i]

, dp[j]+1

) res =

0for temp in dp:

res =

max(temp, res)

return res

def

lengthoflis

(self, nums : list[

int])-

>

int:

top =

# 牌堆初始化為0

piles =

0# num為需要處理的牌

for num in nums:

left, right =0,

while left < right:

mid = left +

(right - left)/2

# 搜尋左側邊界

if top[mid]

> num:

right = mid

# 搜尋右側邊界

elif top[mid]

< num:

left = mid +

1else

right = mid

if left == piles:

# 如果沒有找到合適的牌堆,就新建乙個牌堆

piles +=

1# 將該牌放到新建的牌堆頂

top[left]

= num

# 牌堆數就是最長遞增子串行的長度

return piles

動態規劃之最長回文串

dp i j 表示 以s i 開始s j 結尾的回文串的長度。如果這個字串不是回文串,讓dp i j 0 顯然,j i,只需往dp填j i的部分即可。dp i j 的遞推公式可以這麼表述 1 首先對dp的對角線元素初始化為1,也就是當i j時,dp i j 1。這很顯然,每個單獨的字元其實就是個長度...

動態規劃之最長公共子串行演算法

動態規劃之最長公共子串行演算法 演算法思想 假設x x1,x2,xm y static void init xy void getchar for i 1 i n i getchar static void lcs length void else if c i 1 j c i j 1 else p...

動態規劃之最長回文子串行

15 2 最長回文子串行 回文 palindrome 是正序與逆序相同的非空字串。例如,所有長度為1的字串,civic,racecar,aibohphobia都是回文。設計高效演算法,求給定輸入字串的最長回文子串行。例如,給定輸入character,演算法應該返回carac.演算法的執行時間是怎麼樣...