题意简述
题目链接
题目描述
有一个 r × c r\times c r×c 的矩阵 a a a,矩阵上的每个点都有一个对应的数值,经过这个点就可以取得对应的数值。
现在位于位置 ( 1 , 1 ) (1,1) (1,1),只能往右或者往下走,终点为 ( r , c ) (r,c) (r,c)。
最大化取得的数值。
题目有多组测试数据。
样例输入
2
2 2
1 1
3 4
2 3
2 3 4
1 6 5
样例输出
8
16
思路分析
这是一道经典的数字三角形模型的题目,仅将 数字三角形 三角形改为矩形。
状态表示
对于矩阵中的点 ( i , j ) (i,j) (i,j),定义状态 f i , j f_{i,j} fi,j。
为什么是这样定义呢?很遗憾,这个问题没有通解(这个是 NP 完全问题),但是只要做多了题,就能够想出来。最后在总结数字三角形模型的时候,笔者会对这种方法做一种解释。
集合
由于路径是 ( 1 , 1 ) → ( i , j ) (1,1)\to(i,j) (1,1)→(i,j),而且题目中要求的是取得的数值,所以集合的定义就呼之欲出了。
集合:所有从 ( 1 , 1 ) (1,1) (1,1) 到 ( i , j ) (i,j) (i,j) 的所有路径。
属性
题目要求最大化取得的数值,所以属性当然就是 max \max max 了。
说得具体一点,是路径上所有取得的数值之和的 max \max max。
状态计算
最后一个不同的点是什么?就是从哪个点转移过来。
从上图可以看出 ( i , j ) (i,j) (i,j) 只能由 ( i − 1 , j ) (i-1,j) (i−1,j) 和 ( i , j − 1 ) (i,j-1) (i,j−1) 转移而来,所以可以将集合分为两部分:
左边的集合如何计算?我们可以将其分为两步: ( 1 , 1 ) → ( i − 1 , j ) → ( i , j ) (1,1)\to(i-1,j)\to(i,j) (1,1)→(i−