动态规划

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值