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

一、小明的背包2

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

输入示例

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

输出示例

复制代码
120

问题分析

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


代码示例

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

问题分析

dpij表示数组A处理到第i个数,数组B处理到第j个数时他们的最大公共子序列的长度。分为两种情况:①ai==bj,那么dpij=dpi-1j-1+1;②ai!=bj,dpij=max(dpi-1j,dpij-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])
相关推荐
随意起个昵称2 天前
状压dp-基础题目2([USACO12MAR] Cows in a Skyscraper G)
c++·算法·动态规划
旖-旎2 天前
《LeetCode 64 最小路径和 || LeetCode 174 地下城游戏》
c++·算法·leetcode·动态规划
智者知已应修善业2 天前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯
旖-旎3 天前
《LeetCode 746 使用最小花费爬楼梯 || LeetCode 91 解码方法》
c++·算法·leetcode·动态规划
wabs6663 天前
关于动态规划【力扣1035.不相交的线和53.最大子数组和的思考】
算法·leetcode·动态规划
小O的算法实验室3 天前
2026年ESWA,基于全局进化动态规划与局部粒子群优化GPU 支持去中心化多机器人路径规划
动态规划
硕风和炜3 天前
【LeetCode: 1301. 最大得分的路径数目 + DP】
java·算法·leetcode·动态规划·dp·记忆化搜索
Keven_113 天前
AcWing算法提高课思路速查:动态规划
算法·动态规划
h_a_o777oah3 天前
【动态规划】区间 DP :三层循环逻辑与模板实现细节(洛谷 P1880)
c++·算法·动态规划·acm·区间dp·化环为链·石子合并
码云数智-大飞4 天前
从 OC 平滑迁移 Swift 完整方案
职场和发展·蓝桥杯