Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 8d79a12

Browse files
Update Readme.md
1 parent 0c144c2 commit 8d79a12

File tree

1 file changed

+1
-1
lines changed
  • Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots

1 file changed

+1
-1
lines changed

‎Dynamic_Programming/3661.Maximum-Walls-Destroyed-by-Robots/Readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dp[i][1] = max(dp[i-1][0], dp[i-1][1]) + shoot(i,1);
1111

1212
计算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号机器人的位置。这样转移方程就是正确的。
1313

14-
同理,计算shoot(i,0)时,我们需要统计在```[left, robot[i]]```区间内有多少个墙。为了避免重复计数,定义区间左端点应该是`left = max(robot[i]-distance[i], robot[i-1]+1)`
14+
同理,计算shoot(i,0)时,我们需要统计在```[left, robot[i]]```区间内有多少个墙。同样为了避免`dp[i-1][0]+shoot(i,0)`可能引入的重复计数,定义区间左端点应该是`left = max(robot[i]-distance[i], robot[i-1]+1)`
1515

1616
对于overlap(i),它的表达式就是`shoot(i-1,1) + shoot(i, 0)`减去两个机器人之间的墙的个数。如果减出来的值是负数,那么返回0(因为不可能有负数个的重合)。
1717

0 commit comments

Comments
(0)

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