51nod 1503 豬和回文

2022-05-16 07:01:11 字數 1520 閱讀 6603

乙隻豬走進了乙個森林。很湊巧的是,這個森林的形狀是長方形的,有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)有多少條漂亮路徑。答案可能非常巨大,請輸出對 109+7109+7 取餘後的結果。

樣例解釋:有三種可能

單組測試資料。

第一行有兩個整數 n,m (1≤n,m≤500),表示森林的長和寬。

接下來有n行,每行有m個小寫字母,表示每乙個格仔的型別。同一種型別用同乙個字母表示,不同的型別用不同的字母表示。

輸出答案佔一行。

3 4aaab

baaa

abba

不難想到可以由中間某個點判斷是否存在回文路徑。由方格取數這道題的套路,我們可以設\(f[i][x1][y1][x2][y2]\)表示走了\(i\)步,從\((1,1)\)出發到了\((x1,y1)\),從\((n,m)\)出發到了\((x2,y2)\)時兩條路徑上的字母相同的方案數。dp方程也不難想到。

接下來的問題是如何處理空間過大。我們可以發現,已知步數和終點橫座標時可以直接推出終點的縱座標。所以,我們可以省略列舉y座標的兩維,狀態也可以省略。然後再用滾動陣列優化步數那一維,就可以優化空間了。

注意n+m是奇數時要特殊考慮一下。

#include #include #include #define n 502

using namespace std;

const int mod=1000000007;

int n,m,i,j,k,f[2][n][n],x;

char c[n][n];

int main()

f[x][1][n]=(c[1][1]==c[n][m]);

int step=(n+m-2)/2;

for(i=1;i<=step;i++)

}} }

int ans=0;

for(i=1;i<=n;i++) ans=(ans+f[x][i][i])%mod;

if((m+n-2)%2)

cout<

return 0;

}

豬和回文 51Nod 1503

dp i j k l 代表從 1,1 到 i,j 與從 n,m 到 k,l 對稱相等的路徑有多少 轉移方程為dp i j k l dp i 1 j k 1 l dp i 1 j k l 1 dp i j 1 k 1 l dp i j 1 k l 1 因i 1 j 1 n k m l恆成立 所以由i ...

51Nod 1503 豬和回文

思路 沒想到要用dp去解決。題目是從起點出發走,我們可以從起點和終點各出發乙個點,每次兩個點各走一步,當然這兩步所對應的字元是要一樣的。於是,定義d step x1 y2 x2 y2 表示第step時第乙個點走到 x1,y1 第二個點走到 x2,y2 時 當然了,這兩個點的字元肯定是相同的 的方法數...

51nod 1503 豬和回文(dp滾存)

題面 大意 在乙個n m的矩形中從 1,1 走到 n,m 而且走過的路徑是一條回文串,統計方案數 sol 我們考慮從 1,1 和 n,m 兩端開始算,這樣就只要保證每次經過的字元一樣就可以滿足回文了,因為一定有乙個迴圈需要列舉步數,知道了步數自然只要知道了x座標就可以算出y座標了,於是只要列舉x1和...