1411矩阵取数问题V3

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细节可以参看国家集训队论文 <基于连通性状态压缩的动态规划问题>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值