1411矩阵取数问题V3

来源:互联网 发布:单片机一键信号发射 编辑:程序博客网 时间:2024/06/05 05:20

1411矩阵取数问题V3
给定一个m行n列的矩阵,你可以从任意位置开始取数,到达任意位置都可以结束,每次可以走到的数是当前这个数上下左右的邻居之一,唯一的限制是每个位置只能经过一次,也就是说你的路径不自交。所经过的数的总作为你的得分,求最大的得分。
Input
第一行两个整数m, n (0 < m, n < 10),表示矩阵的行数和列数。
后面m行,每行n个整数表示矩阵里的数,整数范围[-10000000, +10000000]。
Output
一个整数表示最大得分。
Input示例
3 3
-1 2 -3
-4 5 -6
-10 3 2
Output示例
12
状态表示,用蓝色的边界线表示状态。
这里写图片描述
每个格子可能是如下几种情况,具体选择,取决于边界线上每个格子“对外”的情况。
这里写图片描述

边界线对外可以是入(IN),出(OUT),和无(NONE)。注意“无”可能是左下角或者左上角的情况,即消耗掉一个IN,一个OUT。

如何表示边界线(蓝线)上的状态?
可以用0,1,2表示一个格子的状态,这样所有格子可以用二进制压缩,每个格子占2bit。每决定一个新格子,考虑它左面和上面格子的状态,来枚举当前格子的状态。注意点:
(1) 蓝色边界线上#IN = #OUT,即IN, OUT的总数相等
(2) 连接一个格子的时候,可能会修改之后的IN, OUT (反向)
(3) NONE不一定是没经过(如前所述),可以是抵消一对IN和 OUT。

状态表示dp[x][y][state] 表示当前在(x,y)时,IN-OUT状态(二进制整数)state的最大的分。
dp[x][y]与dp[x][y-1][state]有关。

具体插头dp细节可以参看国家集训队论文 <基于连通性状态压缩的动态规划问题>

原创粉丝点击