摘花生 题解

文章讲述了如何解决一个涉及数字矩阵的路径优化问题,通过状态表示法定义路径集合和属性,利用状态转移方程计算最大数值。作者还给出了代码实现,包括对输入数组的处理和边界条件的考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意简述

题目链接

Vijos ETO P1002

题目描述

有一个 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

状态计算

最后一个不同的点是什么?就是从哪个点转移过来。
图 1
从上图可以看出 ( i , j ) (i,j) (i,j) 只能由 ( i − 1 , j ) (i-1,j) (i1,j) ( i , j − 1 ) (i,j-1) (i,j1) 转移而来,所以可以将集合分为两部分:
图 2
左边的集合如何计算?我们可以将其分为两步: ( 1 , 1 ) → ( i − 1 , j ) → ( i , j ) (1,1)\to(i-1,j)\to(i,j) (1,1)(i

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三日连珠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值