思路:沒想到要用dp去解決。
題目是從起點出發走,我們可以從起點和終點各出發乙個點,每次兩個點各走一步,當然這兩步所對應的字元是要一樣的。
於是,定義d[step][x1][y2][x2][y2],表示第step時第乙個點走到(x1,y1),第二個點走到(x2,y2)時(當然了,這兩個點的字元肯定是相同的)的方法數。
因為此時的方法數是基於上一步的情況,所以用滾動陣列即可,而y又可根據x和step求出,所以可以將陣列維數縮小至3維。
注意n+m是奇數時的情況,需要額外計數。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
namespace
std;910
const
int mod=1e9+7;11
12int
n,m;
13char map[505][505
];14
int d[2][505][505
];15
16void add(int &x,int
y)17
2021
intmain()
2233
34int cur=0
;35 d[0][1][n]=(map[1][1]==map[n][m]);
3637
for(int step=1;step<=(n+m-2)/2;step++)
3855}56
int ans=0;57
for(int i=1;i<=n;i++)
58add(ans,d[cur][i][i]);
59if((n+m)%2)60
for(int i=1;i)
61 add(ans,d[cur][i][i+1
]);62 printf("
%d\n
",ans);63}
64 }
豬和回文 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 豬和回文
乙隻豬走進了乙個森林。很湊巧的是,這個森林的形狀是長方形的,有n行,m列組成。我們把這個長方形的行從上到下標記為1到n,列從左到右標記為1到m。處於第r行第c列的格仔用 r,c 表示。剛開始的時候豬站在 1,1 他的目標是走到 n,m 由於豬回家心切,他在 r,c 的時候,只會往 r 1,c 或 r...
51nod 1503 豬和回文(dp滾存)
題面 大意 在乙個n m的矩形中從 1,1 走到 n,m 而且走過的路徑是一條回文串,統計方案數 sol 我們考慮從 1,1 和 n,m 兩端開始算,這樣就只要保證每次經過的字元一樣就可以滿足回文了,因為一定有乙個迴圈需要列舉步數,知道了步數自然只要知道了x座標就可以算出y座標了,於是只要列舉x1和...