51nod 1503 豬和回文串 動態規劃

2022-08-23 21:24:13 字數 2102 閱讀 8686

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

取餘後的結果。

樣例解釋:有三種可能

單組測試資料。

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

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

output

輸出答案佔一行。
input示例

3 4

aaab

baaa

abba

output示例

3

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]

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 時 當然了,這兩個點的字元肯定是相同的 的方法數...