//https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503
#include<bits/stdc++.h>
using namespace std;
const int MAX=5e2+5;
const int MOD=1e9+7;
int N,M,F[2][MAX][MAX]; //由F[step][x1][y1][x2][y2]压缩得到 第一维只存上一步和当前步的值 即滚动数组
char G[MAX][MAX];
void Add(int& a,int b)
{
a+=b;
if (a>=MOD)
a-=MOD;
}
int main()
{
cin.sync_with_stdio(false);
cin>>N>>M;
for (int i=1; i<=N; i++)
cin>>(G[i]+1);
int cur=0;
F[0][1][N]= (G[1][1]==G[N][M]);
for (int step=1; step<=(M+N-2)/2; step++)
{
cur^=1;
for (int i=1; i<=N; i++)
for (int j=1; j<=N; j++)
F[cur][i][j]=0;
for (int x_1=1; x_1<=N&&x_1-1<=step; x_1++)
for (int x_2=N; x_2>=1&&N-x_2<=step; x_2--)
{
//计算对应的y坐标
int y_1=1+step-(x_1-1);
int y_2=M-(step-(N-x_2));
if (G[x_1][y_1]!=G[x_2][y_2])
continue;
//F[cur^1][*][*]表示上一步的状态
//下上
Add(F[cur][x_1][x_2],F[cur^1][x_1][x_2]);
//下左
Add(F[cur][x_1][x_2],F[cur^1][x_1][x_2+1]);
//右上
Add(F[cur][x_1][x_2],F[cur^1][x_1-1][x_2]);
//右左
Add(F[cur][x_1][x_2],F[cur^1][x_1-1][x_2+1]);
}
}
int Ans=0;
for (int i=1; i<=N; i++)
Add(Ans,F[cur][i][i]);
if ((N+M)%2)//N+M为奇数时
for (int i=1; i<N; i++)
Add(Ans,F[cur][i][i+1]);
cout<<Ans<<endl;
return 0;
}
51NOD 1503 猪和回文
最新推荐文章于 2020-03-23 00:48:15 发布