51NOD 1503 猪和回文

//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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值