我在“AC君”后面发的。
没仔细看是不是真AC君。
大家帮我看看?
进入正题:
思路分析:
节点:每个格子 (i,j) 是图中的一个节点
边:
每个节点 (i,j) 有两条出边:
向右 (i,j) → (i,j+1),权值为 grid[i][j+1]
向下 (i,j) → (i+1,j),权值为 grid[i+1][j]
拓扑排序:
按行优先遍历(先处理第 1 行,再第 2 行...)确保所有前驱节点已计算
动态规划:
dp[i][j] 等价于图中从起点到节点 (i,j) 的最长路径
由于是 DAG,可通过拓扑排序高效求解
关键区别
边权 vs 点权:原问题中数字是放在格子中(点权),但转化为图时将其作为出边的边权
状态转移:dp[i][j] 由其前驱节点的状态推导,符合 DAG 上的动态规划特性
这种解法本质上与原动态规划解法相同,但通过图论的视角,可以更清晰地理解问题的结构,并且适用于更复杂的路径规划问题
嘿嘿,懂了没?
说好的这期要发彩蛋,我都记着呢!
上代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
}
大家期待的彩蛋来喽!
《程序员的异世界吐槽指南》
第一章:被算法选中的男人
林小夏盯着电脑屏幕,第 108 次编译失败的提示让他怀疑人生。"这什么鬼需求!让我用 PHP 实现量子加密?" 他愤怒地拍了下键盘,突然一股蓝光将他***幕。
"欢迎来到代码大陆!" 机械音在耳边炸响,"您已被《宇宙终极编译系统》选中,需要修复本世界的核心 bug。"
林小夏看着周围漂浮的二进制代码,发现自己变成了一只穿着格子衫的仓鼠。"等等!我只是个写 CRUD 的小码农啊!"
第二章:变量类型引发的血案
在新手村,村长颤抖着递来任务卷轴:"勇者啊!我们的小麦突然全变成了字符串类型,面包咬不动,啤酒酿不出来!"
林小夏打开控制台:var wheat = "golden_wheat"; // 这什么鬼强类型!
他试着写修复代码:wheat = parseInt(wheat) + "kg";
系统提示:错误:无法将"golden_wheat"转换为整数,请提供更具体的类型转换函数。
"我懂了!" 林小夏突然掏出 PHP 手册,"在 PHP 里根本不需要类型声明!" 他敲下:<?php $wheat = "golden_wheat"; // 动态类型赛高! ?>
地面突然喷出啤酒喷泉,小麦变成了会跳舞的 HTML 元素。村长感动得热泪盈眶:"这就是传说中的弱类型魔法吗?"
第三章:内存泄漏的巨龙
当林小夏遇到喷吐null的巨龙时,他终于明白这个世界的真相。"你其实是 Java 虚拟机吧?" 他大喊,"每次吐息都会导致内存泄漏对不对?"
巨龙愤怒地甩出错误堆栈:OutOfMemoryError: Java heap space
林小夏不慌不忙掏出手机:"让我看看祖传的 GC 调优秘籍... 把 - Xmx 参数改成 8G 试试?"
巨龙突然缩小成仓鼠大小,委屈地说:"主人,刚才的对象都被回收了呢~"
第四章:终极 BOSS 是产品经理
在世界核心机房,林小夏终于见到了终极 BOSS—— 穿着西装的产品经理。
"你好,我是来提需求的。"BOSS 微笑道,"我们需要在下周上线一个跨时空社交平台,支持量子纠缠消息和时光回溯评论功能。"
林小夏冷笑一声:"我就知道!" 他掏出键盘开始敲代码:
javascript
while(true) {
// 实现时光回溯
history.go(-1);
// 取消上周的需求变更
delete requirement["20250705"];
// 给产品经理发送学习资料
sendEmail("《重构:改善既有代码的设计》");
}
系统突然弹出提示:检测到无限循环攻击,已启动防御机制...
但下一秒,整个世界开始疯狂刷新,产品经理的西装变成了皮卡丘图案。"等等!这不是我要的效果!"
林小夏露出程序员经典微笑:"需求变更?先写个 PRD,经过三方评审,再走变更流程吧。"
虚构的啦!那行 "时光回溯" 代码是小说里的夸张梗,现实中可不能用 history.go(-1) 穿越时空哦~
拜拜喽