1. 程式人生 > 實用技巧 >Blue Mary的戰役地圖

Blue Mary的戰役地圖

Blue Mary的戰役地圖( hash\(\star\star \))

  • 時限:\(1s\) 記憶體:\(256M\)

Descrption

  • \(Blue Mary\) 最近迷上了玩 \(Starcraft\) (星際爭霸) 的 \(RPG\) 遊戲。她正在設法尋找更多的戰役地圖以進一步提高自己的水平。
  • 由於 \(Blue Mary\) 的技術已經達到了一定的高度,因此,對於用同一種打法能夠通過的戰役地圖,她只需要玩一張,她就能瞭解這一類戰役的打法,然後她就沒有興趣再玩兒這一類地圖了。而網上流傳的地圖有很多都是屬於同一種打法,因此 \(Blue Mary\) 需要你寫一個程式,來幫助她判斷哪些地圖是屬於同一類的。
  • 具體來說,\(Blue Mary\) 已經將戰役地圖編碼為 \(n\times n\) 的矩陣,矩陣的每個格子裡面是一個 \(32\) 位(有符號)正整數。對於兩個矩陣,他們的相似程度定義為他們的最大公共正方形矩陣的邊長。兩個矩陣的相似程度越大,這兩張戰役地圖就越有可能是屬於同一類的。

Input

  • 輸入檔案的第一行包含一個正整數 \(n\)
  • 以下 \(n\) 行,每行包含 \(n\) 個正整數,表示第一張戰役地圖的代表矩陣。
  • 再以下 \(n\) 行,每行包含 \(n\) 個正整數,表示第二張戰役地圖的代表矩陣。

Output

  • 輸出檔案僅包含一行。這一行僅有一個正整數,表示這兩個矩陣的相似程度。

Sample Input

3
1 2 3
4 5 6
7 8 9
5 6 7
8 9 1
2 3 4

Sample Output

2

Hint

  • 子矩陣:

    5 6

    8 9

    為兩個地圖的最大公共矩陣

  • 對於\(30\%\) 的資料 \(1<=n<=50\)

  • 對於 \(60\%\) 的資料 \(1<=n<=200\)

  • 對於 \(100\%\) 的資料 \(1<=n<=500\)

  • 來源:\(luogup4398\)

分析

  • 方法一:\(dp\)
    • 此題很像線性 \(dp\) 的求最長公共子串。但不同的是此題是二維矩陣,我們可以參照最長公共子串的模型定義出狀態:\(dp[x1][y1][x2][y2]\)
      表示第一個矩陣的右下角座標為 \((x1,y1)\) ,第二個矩陣的右下角座標為 \((x2,y2)\) 公共正方形最大的邊長。則有狀態轉移方程:
    • \(dp[x1][y1][x2][y2]=min(dp[x1-1][y1-1][x2-1][y2-1],min(dp[x1][y-1][x2][y2-1],dp[x1-1][y1][x2-1][y2]))\)
    • \((x1,y1),(x2,y2)\) 為右下角的最大公共子矩陣要看以當前點的左邊,正上,左上為右下角的三個公共矩陣中最小的再加上 \(1\),這個 \(1\) 就是當前點坐在的行和列。
    • 這是這類題的典型做法,但實在對不起,\(n\le 100\) ,\(n^4\) 有點懸,不過本伺服器還是能壓過。
  • 方法二:二維hash