【DP】经典问题解析

解决DP(动态规划)问题是需要思维训练的,下面列举了四个经典的DP问题和解析,希望对大家有帮助。

 

【题目比较长,在此略去了,可以从网上搜到具体描述。】

 

(一)最长单调递增子序列问题(递减同理)

(1)用一个数组b[n]记录以a[i]结尾的最长单调递增子序列的长度

(2)b[i] = max{a[k] | a[k] < b[k],0 ≤ k < i} + 1, b[0] = 1

(3)序列a的最长单调子序列的长度为max{b[i], 0 ≤ i < n}

 

(二)最大子序列和问题

(1)用一个数组b[n]记录以a[i]结尾的最大子序列和

(2)b[i] = max{a[j] + b[i-1], a[j]}

(3)序列a的最大子序列和为max{b[i], 0 ≤ i < n}

 

(三)最大子矩阵和问题(上题的二维扩展)

(1)限定列的范围(i~j)

(2)对列范围内的每一行求和,从而化为一维序列

(3)化归为问题(二)

 

(四)背包问题

(1)用一个二维数组m,m[i][j]代表在承重j,装入物品为从i到n时可以达到的最大价值

(2)m[i][j] = max(m[i+1][j], m[i+1][j-wi]+vi)

(3)m[1][j]即为最大价值

 

(五)滑雪问题

(1)用一个结构体数组LocHeight记录每个点的坐标和高度

   用一个二维数组len记录以每个点作为路径起点的最长路径长度

(2)将结构体数组按照高度从低到高排序

   注:排序的好处是,处理某个点的时候已经处理完比该点低的所有点的信息,只需一次扫描

(3)对于某点A,四周比A点低的所有点中,选len值最大的点B,将A对应的len值设为B.len+1

(4)扫描len数组,找出最大值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值