1. 程式人生 > >NOIP2018提高組金牌訓練營——動態規劃專題

NOIP2018提高組金牌訓練營——動態規劃專題

整數 mil 提高 targe 背包 r+ 美的 png tps

NOIP2018提高組金牌訓練營——動態規劃專題

https://www.51nod.com/Live/LiveDescription.html#!#liveId=19

多重背包

二進制優化轉化成01背包就好了

1503 豬和回文

一只豬走進了一個森林。很湊巧的是,這個森林的形狀是長方形的,有n行,m列組成。我們把這個長方形的行從上到下標記為1到n,列從左到右標記為1到m。處於第r行第c列的格子用(r,c)表示。

剛開始的時候豬站在(1,1),他的目標是走到(n,m)。由於豬回家心切,他在(r,c)的時候,只會往(r+1,c)或(r,c+1)走。他不能走出這個森林。

這只豬所在的森林是一個非同尋常的森林。有一些格子看起來非常相似,而有一些相差非常巨大。豬在行走的過程中喜歡拍下他經過的每一個格子的照片。一條路徑被認為是漂亮的當且僅當拍下來的照片序列順著看和反著看是一樣的。也就是說,豬經過的路徑要構成一個回文。

數一數從(1,1)到(n,m)有多少條漂亮路徑。答案可能非常巨大,請輸出對 $10^9+7$ 取余後的結果。

樣例解釋:有三種可能

技術分享圖片 技術分享圖片 技術分享圖片

輸入

單組測試數據。
第一行有兩個整數 n,m (1≤n,m≤500),表示森林的長和寬。
接下來有n行,每行有m個小寫字母,表示每一個格子的類型。同一種類型用同一個字母表示,不同的類型用不同的字母表示。

輸出

輸出答案占一行。

輸入樣例

3 4
aaab
baaa
abba

輸出樣例

3

註意到500分數據範圍,考慮n三方的算法
發現回文非常難判斷,可能要記錄整個路徑,不現實
所以從兩端開始搜
f[x1][y1][x2][y2]表示從(1, 1)到(x1,y1),從(n, m)走到(x2, y2)
的方案數。這樣就很好轉移了,有四個方程,分別對應從(1, 1)往下還是往右
(n, m)往上還是往左
但是發現這樣會炸空間,炸時間
那麽顯然有x1 + y1 = x2 + y2
那麽f[x1][y1][x2]可以省去一維
但這樣會炸空間
怎麽辦?
可以這樣設計f[step][x1][x2], step = x1 + y1

有什麽區別?
這樣的話step的這一維只和step-1有關
所以可以用滾動數組優化掉一維的空間。
那麽這道題就完美的解決了。
代碼略……

NOIP2018提高組金牌訓練營——動態規劃專題