leetcode132. Palindrome Partitioning II

0-1背包问题:

有 N 件物品和一个承重为 C 的背包(也可定义为体积),每件物品的重量是 wi,价值是 pi,求解将哪几件物品装入背包可使这些物品在重量总和不超过 C 的情况下价值总和最大。这个问题隐含了一个条件,每个物品只有一件,也就是限定每件物品只能选择 0 个或 1 个,因此又被称为 0-1 背包问题。
遍历之所以耗费时间,是由于它的计算量巨大,我们通过观察它的计算过程可以发现,其实它的很多计算操作计算的都是之前计算过的量。那我们如果把这些已经计算过的量储存起来,当我们需要的适合直接提取它的结果,就起到了减少计算量的效果,动态规划使用的就是这种思想。

下面代码:最重要的部分就是best函数。
首先它创建了一个m+1行n列的数组,用于存储我们已经计算过的数据,r[m][n-1]的意思就是当背包最大重量为m、物品为前n个时,能装下的物品总价格最高的值。(要注意到我们在主函数输入n之后将n加1一次,这么做是为了方便计算,把n加1后可以留出来n=0的位置表示没有物品时的最优解的值)
接下来我们把r数组初始化为0,然后,运用动态规划的基本思想,先限制一个背包的最大重量,再挨个的增加物品数量,求它的最大值。

def max(m,n):
    if(m>n):
        return m
    if(m<n):
        return n
def max1(m,n):
    if(m<n):
        return true
    if(m>n):
        return false
def best(m,list1,list2,n):
    r=[[0 for i in range(n)] for i in range(m+1)];
    for i in range(m+1):
        for j in range(n):
            r[i][j]=0
    for i in range(1,m+1):
        for j in range(1,n):
            r[i][j] = r[i][j-1]
            if(i>=list1[j]):
                r[i][j]=max(r[i][j-1],r[i-list1[j]][j-1]+list2[j])
    return r[m][n-1];
if __name__ =="__main__":
    m= 0;
    print"请输入最大重量"
    m = input()
    print"请输入一组物品的总数量"
    n=input()
    n=n+1
    list1 = [0 for i in range(n)]
    list2 = [0 for i in range(n)]
    print"请依次输入物品的质量"
    for i in range(1, n):
        list1[i] = int(input())
    print"请依次输入物品的价值"
    for i in range(1, n):
        list2[i] = int(input())
        list3[i]=0
    q=best(m,list1,list2,n)
    print q

leetcode132. Palindrome Partitioning II

题目
Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.

Example:

Input: "aab"
Output: 1
Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.
思路

二重动态规划,一个用来记录p[i][j]判断s[i][j]是否回文字符串,另外一个ans[i]代表s[:i]的最小cut是多少。如果s[i :j]是回文字符串,那么ans[j] = min(ans[j],ans[i - 1] + 1)。

class Solution(object):
    def minCut(self, s):
        """
        :type s: str
        :rtype: int
        """
        size = len(s)
        ans = [i for i in range(size)]
        p = [[False for i in range(size)] for j in range(size)]
        j = 1
        while j < size:
            i,ans[j] = j - 1,min(ans[j],ans[j - 1] + 1) 
            p[j][j] = True
            while i >= 0:
                if s[i] == s[j] and ((j - i) < 2 or  p[i+1][j-1]):
                    p[i][j] = True
                    if i == 0:
                        ans[j] = 0
                    else:
                        ans[j] = min(ans[j],ans[i - 1] + 1)
                i -= 1
            j += 1
        return ans[size - 1]        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值