【Winter 2022 刷题】动态规划

定义

  • 将原问题拆成多个子问题,保留子问题的解
  • 关键是找到状态转移方程

典型题

1. 依赖相邻(一维爬梯子,二维找路线);依赖不相邻(分割)

542. 01 Matrix

找每个位置最近的0的距离:左上到右下走一遍, 右下到左上走一遍

221. Maximal Square

由1构成的最大正方形:(i, j)记录以此为右下角的最大正方形边长;当(i, j)位置为1时,dp[i][j] = min(dp[i][j-1], dp[i-1][j-1], dp[i-1][j]) + 1
压缩空间:二维变一维,一维变变量

1143. Longest Common Subsequence

最长公共子序列:二维dp,字符相等dp[i][j] = dp[i-1][j-1] + 1,不相等dp[i][j] = max(dp[i][j-1], dp[i-1][j])

279. Perfect Squares

求正整数最少拆成几个平方数:dp[i] = min(dp[i], dp[i-j*j]) + 1

139. Word Break

输出是否可分割成可以在集合里找到的子串:dpbool vector记录此位置是否可以达到标准,如果substring在字符串里存在,则dp[i] = dp[i-len]

650. 2 Keys Keyboard

复制粘贴字符达到一定长度的最小次数:dp[j] + dp[i/j]

2. 背包问题(与sum有关)

  • N个物品,W容量,每个物品体积w价值v
  • 0-1背包:只能选或不选;完全背包:不限定数量
  • 思路:dp[i][j]表示前i件物品总价值不超过j
// dp[N][W]即答案
// 通常N放外层
// 压缩空间至一维思路很简单,在此省略
for (int i = 1; i <= N; i++) {
   
	// N个物品,即weights和values长度均为N
	int w = weights[i-1], v = values[i-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值