蓝桥杯备赛——DP续【python】

一、小明的背包2

试题链接:https://www.lanqiao.cn/problems/1175/learning/

输入示例

复制代码
5 20
1 6
2 5
3 8
5 15
3 3 

输出示例

复制代码
120

问题分析

这题是完全背包,每个物品有无数个,所以对于任意dp[i][j](其表示的意思为选到第i个物品时所消耗的体积为j),当j>=i的体积时,其可以从三个状态转移过来,①dp[i-1][j](表示一次也不选i)②dp[i-1][j-w]+v (表示第一次选i)③dp[i][j-w]+v(表示不一定第一次选i),把②去掉答案也是对的;当j<i时,只能从dp[i-1][j]转移来啦。


代码示例

python 复制代码
N,V=map(int,input().split())
dp=[[0]*(V+1) for _ in range(N+1)]
for i in range(1,N+1):
    w,v=map(int,input().split())
    for j in range(1,V+1):
        if j-w>=0:
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v,dp[i][j-w]+v)
        else:
            dp[i][j]=dp[i-1][j]
print(dp[N][V])

二、最长公共子序列

试题链接:https://www.lanqiao.cn/problems/1189/learning/

输入示例

python 复制代码
5 6
1 2 3 4 5
2 3 2 1 4 5

输出示例

python 复制代码
4

问题分析

dp[i][j]表示数组A处理到第i个数,数组B处理到第j个数时他们的最大公共子序列的长度。分为两种情况:①a[i]==b[j],那么dp[i][j]=dp[i-1][j-1]+1;②a[i]!=b[j],dp[i][j]=max(dp[i-1][j],dp[i][j-1])


代码示例

python 复制代码
N,M=map(int,input().split())
a=[0]+input().split()
b=[0]+input().split()
dp=[[0]*(M+1) for _ in range(N+1)]
for i in range(1,N+1):
  for j in range(1,M+1):
    if a[i]==b[j]:
      dp[i][j]=dp[i-1][j-1]+1
    else:
      dp[i][j]=max(dp[i-1][j],dp[i][j-1])
print(dp[N][M])
相关推荐
YuanDaima204815 小时前
动态规划基础原理与题目说明
数据结构·人工智能·python·算法·动态规划·手撕代码
WL_Aurora16 小时前
备战蓝桥杯国赛【Day 10】
蓝桥杯
故事和你9116 小时前
洛谷-【数据结构2-2】线段树2
开发语言·数据结构·算法·动态规划·图论
故事和你9116 小时前
洛谷-【数据结构2-2】线段树1
开发语言·javascript·数据结构·算法·动态规划·图论
鱼子星_17 小时前
最短路问题【图论】
数据结构·算法·贪心算法·动态规划·图论
handler012 天前
速通蓝桥杯省一: 前缀和&差分(附经典例题)
c语言·c++·笔记·职场和发展·蓝桥杯
WL_Aurora2 天前
备战蓝桥杯国赛【Day 9】
python·算法·蓝桥杯
闻缺陷则喜何志丹2 天前
【动态规划 前缀和】P7074 [CSP-J2020] 方格取数|普及+
c++·算法·前缀和·动态规划·洛谷
袁雅倩19972 天前
当吸尘器、筋膜枪都用上Type-C,供电方案该怎么选?浅谈PD取电芯片ECP5702的应用
c语言·开发语言·支持向量机·动态规划·推荐算法·最小二乘法·图搜索算法
WL_Aurora2 天前
备战蓝桥杯国赛【Day 8】
算法·蓝桥杯