0-1背包问题
假设有n个物体,编号为1到n,编号为i的物体价值为vi,重量为wi。
现有一个背包,载重为W。
求往里面装的物体的最大价值时的装法。(物体不可分割)
思路:
容易看出它的状态转移方程为:
dp( i,j ) = Max( dp( i-1, j ), dp( i-1, j-w[i] ) + v[i] )
dp( i,j )表示前i件物品,背包剩余容量为j时,所能取得的最大价值
def solve(vlist,wlist,totalWeight,totalLength):
resArr = np.zeros((totalWeight)+1,dtype=np.int32)
for i in range(1,totalLength+1):
for j in range(totalWeight,0,-1):
if wlist[i] <= j:
resArr[j] = max(resArr[j],resArr[j-wlist[i]]+vlist[i])
return resArr[-1]
if __name__ == '__main__':
v = [10,90,70,120]
w = [10,30,20,35]
weight = 50
n = 3
result = solve(v,w,weight,n)
print(result)
参考博客:https://www.jianshu.com/p/25f4a183ede5
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
class Solution(object):
def minCut(self, s):
"""
:type s: str
:rtype: int
"""
n = len(s)
dp = [0 for __ in range(n)]
isPal = [[False for __ in range(n)] for __ in range(n)] # 是否回文存储矩阵
for i in range(n):
m = i
for j in range(i + 1): # j在左边开始,i右边
if s[j] == s[i] and (j + 1 > i - 1 or isPal[j + 1][i - 1]): # 如果i和j都不相等,不需要去判断是否是回文
isPal[j][i] = True
if j == 0: # 整个都是回文串
m = 0
else:
m = min(m, dp[j - 1] + 1) # 要么每个字母都拆,要么之前的字母拆了后+1
dp[i] = m
return dp[-1]