题目给你一个二维数组(每一行的列数不一定相等)。让你求出一条最佳路径。
dp[i][j] : 从(1, 1)走到(i, j)的所有路径集合。
属性:MAXSUM
集合划分:
按照路径的倒数第二个值进行子集划分。先把集合中的所有路径的(i, j)给遮住,然后将这些路径按照路径的最后一个点是否相等划分到不同的集合。在把(i, j)加上,就把所有的路径都给划分好了。
求属性:
我们要求{i, j}集合里的所有路径的最大值,等价于求所有子集的最大值。对{i, j}划分好的一个子集G,它包含的所有路径,肯定是从(1, 1)走到(p, q),再从(p, q)走到(i, j)。因此,我们可以先求出(1, 1)到(p, q)这一部分的最佳路径,再加上(i, j)。而(1, 1)走到(p,q)的这一部分路径,全部被包含在了集合{p,q}中,不多不少。因此,G的最大路径值就是dp[p][q] + w[i][j]。
dp[i][j] = max(w[i][j], dp[pi][qi] + w[i][j])。
与上个题的分析方式相同。
我们可以看作两条路径同时从(1, 1)走到(m, n)。
把一类路径放到集合中去(这里对集合,有一个好的理解方法:如果集合中只有一个路径,那就相当于dfs暴力枚举。dfs的过程,也就相当于,从一
个集合,走到其它的集合,这样就建好了一个决策树。而动态规划是把一类路径,放到一个集合中)。
dp{k, i, j}
集合表示:两人同时走了k步,一人从(1, 1)走到(i, k - i),另一人从(1, 1)走到(j, k - j)的所有路径
属性:MAX
集合划分:{k, i, j}可以依据最后一步划分成若干子集:
右 右:第一个人最后一步向右走来到了{i, k - i},第二个人最后一步也向右走来到了{j, k - j}。对于这些方案,我们想要求出其最大值,可以
把路径分为两段:对于第一个人,它的路径可以看作从(1, 1)走到(i, k - i - 1)一段,再把{i, k - i}单独看作一段。第二个人同理。那么我们
可以分别求出这两段的最大值。对于第一段,其最大值为dp[k - 1][i][j],第二段就是g[i][k - i] + g[j][k - j]。所以子集的最大值为:
dp[k - 1][i][j] + g[i][k - i] + g[j][k - j]
右 下:dp[k - 1][i][j - 1] + g[i][k - i] + g[j][k - j]
下 右:dp[k - 1][i - 1][j] + ~
下 下:~