【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数组,找出最大值

原文地址:https://www.cnblogs.com/ganganloveu/p/2732570.html