注意:子串行和子串之間的區別
最長遞增子串行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.演算法的執行時間是怎麼樣...