首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POJ 3034:砸地鼠遊戲 DP 優化

     編輯:關於C++

問題描述

n x n 格子,錘子每步最多移動曼哈頓距離 d(實為切比雪夫距離?題目說「移動 d」通常指切比雪夫)。地鼠在時刻 t 出現在 (x,y),持續 1 時間單位。錘子可砸經過的地鼠。初始位置任意。求最多砸中數。n ≤ 20, d ≤ 5, t ≤ 10。

DP 狀態

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) 極小,瞬間通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved