n x n 格子,錘子每步最多移動曼哈頓距離 d(實為切比雪夫距離?題目說「移動 d」通常指切比雪夫)。地鼠在時刻 t 出現在 (x,y),持續 1 時間單位。錘子可砸經過的地鼠。初始位置任意。求最多砸中數。n ≤ 20, d ≤ 5, t ≤ 10。
dp[t][x][y]:時刻 t 錘子在 (x,y) 最大砸中數。
從 (x,y) 可達位置為以 (x,y) 為中心、半徑 d 的正方形。直接枚舉 O(d^2) 轉移。但可利用方向性:對每個方向向量 (dx,dy),沿射線延伸,累加沿途地鼠數,更新 dp[t][x][y]。代碼中用 k 步長枚舉射線。
為避免負坐標,將所有座標平移 (d,d)(或更大),數組開 [n+2d][n+2d]。樣例說明需平移 5。
void f(int n, int t, int x, int y, int d) {
for (int i = max(0, x-d); i <= min(n-1, x+d); i++)
for (int j = max(0, y-d); j <= min(n-1, y+d); j++) {
if (i==x && j==y) continue;
int dx = i-x, dy = j-y;
int k=0, num=0;
while (x+k*dx >=0 && x+k*dx=0 && y+k*dy
t_max ≤ 10, n ≤ 20, d ≤ 5,狀態數 10*400=4000,轉移每狀態 O(d^2 * d) 極小,瞬間通過。