作业介绍

A

  • f[i]: 到 i 为止的最大和,必须包含 a[i]
  • 转移方程:1. 只有 a[i] 一个 2. a[i]连上之前的某一段
  • f[i] = max(a[i] , f[i-1]+a[i]);
  • 注意:值可以为负数,

B

  • f[i] : 走到i的时候的最多能获得的礼物,保证 i 是一定要拿到的, 这个时候的时间一定是 a[i]
  • 拿到礼物 i 的时间a[i], 之前拿的礼物发放时间肯定在 a[i] 前面,
  • 对礼物的发放时间进行排序,依次来,
  • 转移:1. 自己一个 1 , 2. 在之前拿完某个以后到 a[i]
    1. 遍历之前所有发放时间比 当前时间早的 j, 满足条件: a[j] + t[j][i] <= a[i]
  • 注意点:struct node{int t, id; // id 摊位号}

c

  • f[i] : 到达 i 的最大分数
  • i 可以是通过 任意一个通道 a[j] 到达 , f[i-a[j]] + b[i - a[j]]

D

  • f[i] :到达 i 的方案数
  • 斐波那契一样的, f[i] = f[i-1]+f[i-2]+f[i-3]

E

  • 完全背包
  • 组合方案数, 排列方案数
  • 组合: 先遍历物品,再遍历容量:(先遍历物品,保证了物品只会按照顺序出现)
  • 排列: 先遍历容量,再遍历物品:(后遍历物品,无法保证物品按照顺序出现,排列)

F

  • 完全背包
  • 物品重量 w[i] = i*i , 价值 v[i] = 1
  • min , 初始值,正无穷, f[0] =0;

G

  • 河中心只有 0 个石墩:m 个荷叶:最多能有多少青蛙:m+1
  • 状态: f[i] : 河中心有 i 个石墩的时候,能有的青蛙的数量
  • f[0] = m+1
  • f[1] = f[0] + m+1 = 2*m + 2
  • f[2] = f[0] +f[1] + m+1
  • f[i] = f[0] +f[1] +...f[i-1] + m+1

H

  • 状态:到 i 的最多组数
  • 转移: 1. f[i]=1, (a[i]>=0) , 自己单独一组 2.f[i] = f[j] +1 和之前的部分形成一段(1- j之间 , j+1 - i 之间是新的一段)(sum[i] - sum[j]>=0)

I

  • 题目分类, 每个类别里面选无数个
  • 完全背包:题目花费的时间就是重量, 题目的分数就是价值

J

  • 合法队列:112222 111112 12 11 22
  • 题目要求就是:把不合法队列修改成合法队列的最小次数
  • 状态:f[i][j] 到 i 为止状态为 j 合法的最小次数, (i位置是 1 ,是 2 两种可能)
  • 转移:f[i][1] = f[i-1][1] + (a[i]!=1) , i 位置是1,之前的所有位置都得是 1
  • 转移: f[i][2] = min(f[i-1][1] , f[i-1][2]) + (a[i] != 2)
  • 输出 min(f[n][1] , f[n][2])

K 多重背包

  • // 多重背包的基础是 01 背包?
  • // 01 背包 倒着循环容量保证了只取一个 // 01 背包 for (int i = 1; i <= n; i++) // 遍历物品 for (int j = m; j >= w[i]; j--) // 遍历容量 f[j] = max(f[j], f[j - w[i]] + v[i]);

// 多重背包 for (int i = 1; i <= n; i++) // 遍历物品 for (int k = 1 ; k <= c[i]; k++) // 遍历数量 for (int j = m; j >= w[i]; j--) // 遍历容量 f[j] = max(f[j], f[j - w[i]] + v[i]);

  • 优化:二进制优化
  • for (int i = 1; i <= n; i++) { int a, b, c; cin >> a >> b >> c; // 二进制拆分 for (int j = 1 ; j <= c; j *= 2) { // 拆分出 j 件 w[++tot] = a * j; v[tot] = b * j; c -= j; } if (c) { w[++tot] = c * a; v[tot] = c * b; } }

L

  • 完全背包

M

  • 完全背包, 求最小值,初始化为最大值
  • f[0] = 0;
  • f[j] = min(f[j] , f[j-w[i]]+1)

N

  • 一个人只能说固定的单词
  • 判断某一句话,他能不能说 , 判断某一句话能不能凑出来
  • 状态:f[i] 第 i 位能不能匹配
  • 转移:1. 存在第 i 位置这个单词, f[i] =1
  •  2.  存在第 i 位和 i+1 位置合起来的单词, f[i+1] =1 
    
  • unordered_set

O

  • 01背包,限制了重量和体积
  • f[i][j] = max(f[i][j] , f[i-w[i]][j-v[i]]+value[i])

P

  • 层级, 点的编号
  • f[i][j] : 到达第 i 层, 第 j 个点的最小花费
  • f[0][1] = 0 , 初始化为极大值
  • f[i][j] = min(f[i][j] , f[i-1][能到达 j的点] +当前航线的花费)
  • 无需建图,直接边输入边处理

Q

  • 买饲料的花费:本身的价格 + 运费, 分别算出每一吨花费多少钱
  • 买 K 吨, 容量
  • 贪心: 优先购买每一吨花费最小的饲料
  • 多重背包: 重量: 每吨是1 价值:价格 +运费, 数量:每个商店有几吨

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
41
开始时间
2026-4-12 0:00
截止时间
2026-5-31 23:59
可延期
24 小时