1503 豬和回文
基準時間限制:2 秒 空間限制:131072 kb
乙隻豬走進了乙個森林。很湊巧的是,這個森林的形狀是長方形的,有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+7
取餘後的結果。
樣例解釋:有三種可能
單組測試資料。output第一行有兩個整數 n,m (1≤n,m≤500),表示森林的長和寬。
接下來有n行,每行有m個小寫字母,表示每乙個格仔的型別。同一種型別用同乙個字母表示,不同的型別用不同的字母表示。
輸出答案佔一行。input示例
3 4output示例aaab
baaa
abba
3dp[i][j][k]=dp[i][j][k]+dp[i-1][j][k]dp[i][j][k]代表從起點走到(i,j)和從終點走到(k,t);由於已知i,j,k可以推導出t,所以空間上可以優化
dp[i][j][k]=dp[i][j][k]+dp[i-1][j][k+1]
dp[i][j][k]=dp[i][j][k]+dp[i][j-1][k]
dp[i][j][k]=dp[i][j][k]+dp[i][j-1][k+1]
共四種情況,可以發現dp[i]由dp[i-1]得出,所以空間上還可以優化,滾動陣列,記得滾動的時候不忘清0
奇偶可以統一討論,不要想的太複雜
#include#include#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)>(y)?(y):(x)
#define cls(name,x) memset(name,x,sizeof(name))
using
namespace
std;
const
int inf=1
<<28
;const
int maxn=510
;const
int maxm=1e2+10
;const
int mod=1e9+7
;int dp[2
][maxn][maxn];
char
bool judge(int x1,int y1,int x2,int
y2)int
main()
dp[1][1][n]=1
;
for(int i=1;i<=n;i++)
cls(dp[(i-1)%2],0
); }
printf(
"%d\n
",ans);
}return0;
}
豬和回文 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去解決。題目是從起點出發走,我們可以從起點和終點各出發乙個點,每次兩個點各走一步,當然這兩步所對應的字元是要一樣的。於是,定義d step x1 y2 x2 y2 表示第step時第乙個點走到 x1,y1 第二個點走到 x2,y2 時 當然了,這兩個點的字元肯定是相同的 的方法數...