From 49cb76f469dc1ec82c7d0297792043f9781a8373 Mon Sep 17 00:00:00 2001 From: wisdompeak Date: 2025年8月26日 01:10:42 -0700 Subject: [PATCH 1/5] Create 3661.Maximum-Walls-Destroyed-by-Robots.cpp --- ...3661.Maximum-Walls-Destroyed-by-Robots.cpp | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/3661.Maximum-Walls-Destroyed-by-Robots.cpp diff --git a/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/3661.Maximum-Walls-Destroyed-by-Robots.cpp b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/3661.Maximum-Walls-Destroyed-by-Robots.cpp new file mode 100644 index 000000000..ded1f1cbf --- /dev/null +++ b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/3661.Maximum-Walls-Destroyed-by-Robots.cpp @@ -0,0 +1,39 @@ +class Solution { + int dp[100005][2]; +public: + int maxWalls(vector& robots, vector& distance, vector& walls) { + int n = robots.size(); + vector>r; + for (int i=0; i Date: 2025年8月26日 01:11:21 -0700 Subject: [PATCH 2/5] Update Readme.md --- Readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Readme.md b/Readme.md index 53da52feb..02399300f 100644 --- a/Readme.md +++ b/Readme.md @@ -824,6 +824,7 @@ [2361.Minimum-Costs-Using-the-Train-Line](https://github.com/wisdompeak/LeetCode/tree/master/Dynamic_Programming/2361.Minimum-Costs-Using-the-Train-Line) (M+) [2786.Visit-Array-Positions-to-Maximize-Score](https://github.com/wisdompeak/LeetCode/tree/master/Dynamic_Programming/2786.Visit-Array-Positions-to-Maximize-Score) (M) [3122.Minimum-Number-of-Operations-to-Satisfy-Conditions.cpp](https://github.com/wisdompeak/LeetCode/blob/master/Dynamic_Programming/3122.Minimum-Number-of-Operations-to-Satisfy-Conditions) (M+) +[3661.Maximum-Walls-Destroyed-by-Robots](https://github.com/wisdompeak/LeetCode/tree/master/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots) (H-) * ``基本型 II`` [368.Largest-Divisible-Subset](https://github.com/wisdompeak/LeetCode/tree/master/Dynamic_Programming/368.Largest-Divisible-Subset) (M+) [300.Longest-Increasing-Subsequence](https://github.com/wisdompeak/LeetCode/tree/master/Greedy/300.Longest-Increasing-Subsequence) (M+) From f656327c1d9a38e25c99ee83d2ba209de56a1675 Mon Sep 17 00:00:00 2001 From: wisdompeak Date: 2025年8月26日 01:55:35 -0700 Subject: [PATCH 3/5] Create Readme.md --- .../Readme.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md diff --git a/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md new file mode 100644 index 000000000..5ffa78475 --- /dev/null +++ b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md @@ -0,0 +1,17 @@ +### 3661.Maximum-Walls-Destroyed-by-Robots + +直观上容易想到这是DP,因为每个robot只有两种决策,所以容易设计dp[i][j]表示从前往后处理,当第i个机器人选择j方向(0或者1)时能得到的最优解。转移方程也不难写出: +``` +dp[i][0] = max(dp[i-1][1]+shoot(i,0)-overlap(i), dp[i-1][0]+shoot(i,0)); +dp[i][1] = max(dp[i-1][0], dp[i-1][1]) + shoot(i,1); +``` +其中shoot(i,0)表示第i号机器人朝左射击时能够击中的墙壁个数,shoot(i,1)表示第i号机器人朝右射击时能够击中的墙壁个数。overlap(i)表示当i-1号与i号机器人对射时,总共所能击中的墙壁个数。 + +稍微解释一下:对于dp[i][0],它的前驱状态有两种dp[i-1][0]和dp[i-1][1]。对于前者,因为相邻两个机器人对射,所以我们要减去两者击中墙壁里重合的个数。 + +计算shoot(i,0)时,我们需要统计在```[robot[i]-distance[i], robot[i]]```区间内有多少个墙。根据规则,子弹不能击穿相邻的机器人,所以对于区间的左端点,需要与robot[i-1]之间取大。事实上此处有一个细节:加入robot[i-1]恰好有一座墙,那么它的击穿是属于第i-1号机器人还是第i号机器人?为了避免重复计数,我们约定,任何恰好在robot[i]处的墙,我们认为只是被第i号机器人击穿的。所以区间左端点应该是`max(robot[i]-distance[i], robot[i-1]+1)`。 + +同理,计算shoot(i,1)时,我们需要统计```[robot[i], right]```区间内有多少墙,其中`right = min(robot[i]+distance[i], robot[i+1]-1)`. + +对于overlap(i),它的表达式就是`shoot(i-1,1) + shoot(i, 0)`减去两个机器人之间的墙的个数。如果减出来的值是负数,那么返回0(因为不可能有负数个的重合)。 + From 0c144c2718da6fbac9e45fc4ab94d882d0aaee76 Mon Sep 17 00:00:00 2001 From: wisdompeak Date: 2025年8月26日 02:07:09 -0700 Subject: [PATCH 4/5] Update Readme.md --- .../3661.Maximum-Walls-Destroyed-by-Robots/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md index 5ffa78475..df89e76ef 100644 --- a/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md +++ b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md @@ -9,9 +9,9 @@ dp[i][1] = max(dp[i-1][0], dp[i-1][1]) + shoot(i,1); 稍微解释一下:对于dp[i][0],它的前驱状态有两种dp[i-1][0]和dp[i-1][1]。对于前者,因为相邻两个机器人对射,所以我们要减去两者击中墙壁里重合的个数。 -计算shoot(i,0)时,我们需要统计在```[robot[i]-distance[i], robot[i]]```区间内有多少个墙。根据规则,子弹不能击穿相邻的机器人,所以对于区间的左端点,需要与robot[i-1]之间取大。事实上此处有一个细节:加入robot[i-1]恰好有一座墙,那么它的击穿是属于第i-1号机器人还是第i号机器人?为了避免重复计数,我们约定,任何恰好在robot[i]处的墙,我们认为只是被第i号机器人击穿的。所以区间左端点应该是`max(robot[i]-distance[i], robot[i-1]+1)`。 +计算shoot(i,1)时,我们需要统计```[robot[i], right]```区间内有多少墙。根据规则,子弹不能击穿相邻的机器人,所以对于区间的右端点,需要与robot[i+1]之间取小。故`right = min(robot[i]+distance[i], robot[i+1])`. 但是此处有一个容易忽视的细节。当我们用转移方程`dp[i][1] = dp[i-1][1]) + shoot(i,1)`时,如果第i号机器人处恰好有墙,且恰能被第i-1号机器人射中,那么这个墙就会被计算两次。为了避免重复计算可能造成的混乱,我们约定,任何恰好在robot[i]处的墙,我们认为只是被第i号机器人击穿的。所以,shoot(i,1)的右边界应该重新定义为`right = min(robot[i]+distance[i], robot[i+1]-1)`,剔除掉第i+1号机器人的位置。这样转移方程就是正确的。 -同理,计算shoot(i,1)时,我们需要统计```[robot[i], right]```区间内有多少墙,其中`right = min(robot[i]+distance[i], robot[i+1]-1)`. +同理,计算shoot(i,0)时,我们需要统计在```[left, robot[i]]```区间内有多少个墙。为了避免重复计数,定义区间左端点应该是`left = max(robot[i]-distance[i], robot[i-1]+1)`。 对于overlap(i),它的表达式就是`shoot(i-1,1) + shoot(i, 0)`减去两个机器人之间的墙的个数。如果减出来的值是负数,那么返回0(因为不可能有负数个的重合)。 From 8d79a12fc4ef3bdde5db49c5be70dccc6d32eee4 Mon Sep 17 00:00:00 2001 From: wisdompeak Date: 2025年8月26日 02:08:20 -0700 Subject: [PATCH 5/5] Update Readme.md --- .../3661.Maximum-Walls-Destroyed-by-Robots/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md index df89e76ef..425991bd9 100644 --- a/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md +++ b/Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md @@ -11,7 +11,7 @@ dp[i][1] = max(dp[i-1][0], dp[i-1][1]) + shoot(i,1); 计算shoot(i,1)时,我们需要统计```[robot[i], right]```区间内有多少墙。根据规则,子弹不能击穿相邻的机器人,所以对于区间的右端点,需要与robot[i+1]之间取小。故`right = min(robot[i]+distance[i], robot[i+1])`. 但是此处有一个容易忽视的细节。当我们用转移方程`dp[i][1] = dp[i-1][1]) + shoot(i,1)`时,如果第i号机器人处恰好有墙,且恰能被第i-1号机器人射中,那么这个墙就会被计算两次。为了避免重复计算可能造成的混乱,我们约定,任何恰好在robot[i]处的墙,我们认为只是被第i号机器人击穿的。所以,shoot(i,1)的右边界应该重新定义为`right = min(robot[i]+distance[i], robot[i+1]-1)`,剔除掉第i+1号机器人的位置。这样转移方程就是正确的。 -同理,计算shoot(i,0)时,我们需要统计在```[left, robot[i]]```区间内有多少个墙。为了避免重复计数,定义区间左端点应该是`left = max(robot[i]-distance[i], robot[i-1]+1)`。 +同理,计算shoot(i,0)时,我们需要统计在```[left, robot[i]]```区间内有多少个墙。同样为了避免`dp[i-1][0]+shoot(i,0)`可能引入的重复计数,定义区间左端点应该是`left = max(robot[i]-distance[i], robot[i-1]+1)`。 对于overlap(i),它的表达式就是`shoot(i-1,1) + shoot(i, 0)`减去两个机器人之间的墙的个数。如果减出来的值是负数,那么返回0(因为不可能有负数个的重合)。

AltStyle によって変換されたページ (->オリジナル) /