2024-05-06

秦篆原创算法typeScriptalgorithm大约 2 分钟

假期结束!一起来刷题吧!

741. 摘樱桃 (困难)

给你一个 n x n 的网格 grid ,代表一块樱桃地,每个格子由以下三种数字的一种来表示:

  • 0 表示这个格子是空的,所以你可以穿过它。
  • -1 表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。
  • -1 表示这个格子里有荆棘,挡着你的路。

请你统计并返回:在遵守下列规则的情况下,能摘到的最多樱桃数:

  • 从位置 (0, 0) 出发,最后到达 (n - 1, n - 1) ,只能向下或向右走,并且只能穿越有效的格子(即只可以穿过值为 0 或者 1 的格子);
  • 当到达 (n - 1, n - 1) 后,你要继续走,直到返回到 (0, 0) ,只能向上或向左走,并且只能穿越有效的格子;
  • 当你经过一个格子且这个格子包含一个樱桃时,你将摘到樱桃并且这个格子会变成空的(值变为 0 );
  • 如果在 (0, 0) 和 (n - 1, n - 1) 之间不存在一条可经过的路径,则无法摘到任何一个樱桃。

分析

ok,首先呢一眼就可以看出这是一道动态规划的题目,我们可以使用动态规划来解决这个问题。
按照惯例,先找一下它的状态转移方程。按照题目所给的信息,我们可以将两种走法等价为两个人从起始点同时向(n - 1,n - 1)走,只不过由于 樱桃是有限的,所以需要考虑樱桃被其中一人得到后该格子置为0的情况。

  1. 定义一个状态dp[k][x1][x2],其中,k为两人的步数之和,x1和x2分别为两人的横坐标。则dp[k][x1][x2]表示两人在k步之后分别到达(x1,k-x1)和(x2,k-x2)时能够得到的最大樱桃数。
  2. 判断各种行走方案,都往右走则状态从dp[k-1][x1][x2]转移而来,都往下走则状态从dp[k-1][x1-1][x2-1]转移而来,一人往右一人往下则状态从dp[k-1][x1-1][x2]或dp[k-1][x1][x2-1]转移而来。
上次编辑于:
贡献者: luolj