首页 > 其他分享 >Leetcode刷题第十二天-动态规划

Leetcode刷题第十二天-动态规划

时间:2024-02-22 16:12:33浏览次数:32  
标签:背包 第十二天 nums int range 遍历 Leetcode dp 刷题

1049:最后一块石头的重量II

链接:1049. 最后一块石头的重量 II - 力扣(LeetCode)

 1 class Solution:
 2     def lastStoneWeightII(self, stones: List[int]) -> int:
 3         #dp[i]背包为i的最大价值为dp[i]
 4         #推导公式dp[i]=max(dp[i], dp[i-stones[i]]+stones[i])
 5         #dp数组初始化dp=[0]*1501
 6         #遍历顺序:背包倒序
 7         #打印dp数组
 8         sums=sum(stones)
 9         num=sums//2
10         dp=[0]*1501
11         for stone in stones:
12             for i in range(num,stone-1,-1):
13                 dp[i]=max(dp[i],dp[i-stone]+stone)
14         return sums-2*dp[num]
lastStoneWeightII

494:目标和

链接:494. 目标和 - 力扣(LeetCode)

 1 class Solution:
 2     def findTargetSumWays(self, nums: List[int], target: int) -> int:
 3         #dp[i]背包为i装满i有dp[i]方法
 4         #推导公式dp[i]+=dp[i-nums[j]](j:0--len(nums))
 5         #dp数组初始化dp=[1]
 6         #遍历顺序:背包倒序
 7         #打印dp数组
 8         sums=sum(nums)
 9         if((sums+target)%2):    return 0
10         num=(sums+target)//2
11         dp=[0]*1001
12         dp[0]=1
13         for n in nums:
14             for i in range(num,n-1,-1):
15                 dp[i]+=dp[i-n]
16         return dp[num]
findTargetSumWays

474:1和0

链接:474. 一和零 - 力扣(LeetCode)

 1 class Solution:
 2     def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
 3         #dp[i][j]背包为i,j最大价值
 4         #推导公式dp[i][j]=max(dp[i][j],dp[i-x][j-y]+1)
 5         #dp数组初始化dp=[1]
 6         #遍历顺序:倒序
 7         #打印dp数组
 8         dp=[[0 for i in range(n+1)] for j in range(m+1)]
 9         for s in strs:
10             x=s.count('0')
11             y=s.count('1')
12             for i in range(m,x-1,-1):
13                 for j in range(n,y-1,-1):
14                     dp[i][j]=max(dp[i][j],dp[i-x][j-y]+1)
15         return dp[m][n]
findMaxForm

01背包最大价值推到公式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]),正序遍历

降低维度:dp[j] = max(dp[j], dp[j - w[i]] + v[i]),倒序遍历背包

01背包装满的方法个数:dp[i]+=dp[i-nums[j]](j:0--len(nums)),倒序

牛客跳台阶扩展

链接:跳台阶扩展问题_牛客题霸_牛客网 (nowcoder.com)

递推公式:dp[i] += dp[j](j:0---i)

 1 import sys
 2 
 3 for line in sys.stdin:
 4     a = line.split()
 5     n = int(a[0])
 6     dp = [0] * (n + 1)
 7     if n < 3:
 8         print(n)
 9         break
10     dp[0], dp[1], dp[2] = 1, 1, 2
11     for i in range(3, n + 1):
12         for j in range(i):
13             dp[i] += dp[j]
14     print(dp[n])
climbStairs2

标签:背包,第十二天,nums,int,range,遍历,Leetcode,dp,刷题
From: https://www.cnblogs.com/xiaoruru/p/18027568

相关文章

  • # 代码随想录算法训练营day01 | leetcode 704. 二分查找、35.搜索插入位置、34.在排序
    题目链接:704.二分查找-简单题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示......
  • 刷题记录_2024寒假2/19~2/21
    P4287[SHOI2011]双倍回文考虑马拉车,但是我不会马拉车怎么办,考虑PAM我们在记录一般的fail之外再记录一个trans指针指向小于等于当前节点长度一半的最长回文后缀然后枚举每个节点#include<bits/stdc++.h>usingnamespacestd;chars[2000001];intlen[2000001],trans[2000......
  • leetcode day01
    链表类:#88.合并两个有序数组//classSolution:defmerge(self,nums1:List[int],m:int,nums2:List[int],n:int)->None:p1,p2,p=m-1,n-1,m+n-1whilep2>=0:#nums2还有要合并的元素#如果p1<0,那么走el......
  • Leetcode刷题第十天-动态规划
    ......
  • [刷题笔记] P2881
    例题:P2881注意到\(n\le1000\)。数据较小。且有传递性,即如果\(x,y\)关系确定,\(y,z\)关系确定,那么\(x,z\)关系确定。考虑传递闭包。传递闭包从关系图的角度来说,如果原图上存在一条\(u,v\)路径,那么传递闭包就将\(u,v\)连边。传递闭包可以使用Floyd算法解决。枚举中......
  • Leetcode 21-25题
    合并两个有序链表将两个升序链表合并为一个新的升序链表。用两个指针指向两个链表的表头,然后每次比较一下哪个值小,将较小的节点接到答案后面即可。ListNode*mergeTwoLists(ListNode*list1,ListNode*list2){autodummy=newListNode(),p=dummy;autol1=......
  • Leetcode 16-20题
    最接近的三数之和给定整数数组和目标值target,从数组中选出三个整数,使得和与target最接近,并返回三数之和。保证恰好存在一个解。和上一题类似,我们先对整数数组排序,然后固定i,枚举j,找到满足nums[i]+nums[j]+nums[k]>=target的最小的k。那么显然有nums[i]+nums[j]+nums[k-1]<targ......
  • [刷题笔记] P9751 [CSP-J 2023] 旅游巴士
    Problem_LinkDescription给定一个\(n\)个点,\(m\)条边的有向图。起点为\(1\),终点为\(n\)。起始时间和终止时间必须是\(k\)的倍数。通过每条边的时间为\(1\)。每条边有限制\(a_i\)即若通过当前边必须满足当前时间\(t\geqa_i\)。求满足上述限制的前提下,到达终点的最小......
  • Leetcode 11-15题
    盛最多雨水的容器数组的第\(i\)个数字表示这个位置隔板的高度,选择哪两块板子可以装最多的水,返回可以存储的最大水量。有一种双指针的贪心策略:如果左边的指针所在的挡板低,就将左边的指针右移,否则将右边的指针左移。每次移动完之后,计算当前能存储的水量,并和结果值相比较。证明......
  • 刷题记录_2024寒假2/17
    我都AFO了为什么还要我写题目P多少多少默认洛谷P3313旅行题意略,自己不会看吗考虑对每个信仰开一个线段树,下标为dfs序,然后就是树剖板子对于这种开一堆动态开点线段树的题目可以存每个线段树的根节点然后就只需要开一个结构体了code:#include<bits/stdc++.h>#definelct[n......