Codeforces Round #316 (Div. 2) E. Pig and Palindromes

E. Pig and Palindromes
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Peppa the Pig was walking and walked into the forest. What a strange coincidence! The forest has the shape of a rectangle, consisting of n rows and m columns. We enumerate the rows of the rectangle from top to bottom with numbers from 1 to n, and the columns — from left to right with numbers from 1 to m. Let's denote the cell at the intersection of the r-th row and the c-th column as (r, c).

Initially the pig stands in cell (1, 1), and in the end she wants to be in cell (n, m). Since the pig is in a hurry to get home, she can go from cell (r, c), only to either cell (r + 1, c) or (r, c + 1). She cannot leave the forest.

The forest, where the pig is, is very unusual. Some cells of the forest similar to each other, and some look very different. Peppa enjoys taking pictures and at every step she takes a picture of the cell where she is now. The path through the forest is considered to be beautiful if photographs taken on her way, can be viewed in both forward and in reverse order, showing the same sequence of photos. More formally, the line formed by the cells in order of visiting should be a palindrome (you can read a formal definition of a palindrome in the previous problem).

Count the number of beautiful paths from cell (1, 1) to cell (n, m). Since this number can be very large, determine the remainder after dividing it by 109 + 7.

Input

The first line contains two integers n, m (1 ≤ n, m ≤ 500) — the height and width of the field.

Each of the following n lines contains m lowercase English letters identifying the types of cells of the forest. Identical cells are represented by identical letters, different cells are represented by different letters.

Output

Print a single integer — the number of beautiful paths modulo 109 + 7.

Examples
Input
3 4
aaab
baaa
abba
Output
3
Note

Picture illustrating possibilities for the sample test.


【题意】给定N*M的字符迷宫,要从(1,1)走到(n,m),只能向右和向下走,问路径形成回文串的路径有多少?

【解题方法】

//
考虑有2个人分别从(1,1)和(n,m)同时出发,在中间相遇
考虑状态f[x1][y1][x2][y2]:=第1个人到(x1,y1),第2个人到(x2,y2)符合条件的路径数
显然O(n4)会T,考虑一个常见优化,由于2个人走的步数是相同的,只要记录步数以及x坐标就可以算出对应的y坐标了
新的状态f[i][x1][x2]:=2个人走了i步,且第1个人的x坐标为x1,第2个人的为x2,的符合条件的路径数
转移就枚举,第1个人向右向下,第2个人向上向左,4种转移即可
统计答案的时候需要枚举相遇的点,显然ans+=∑ni=1f[step][i][i]
但是对于路径步数是偶数的,还可以ans+=∑ni=1f[step][i][i+1]
O(n3)的空间会炸,滚动数组优化一下就好了
【AC 代码】

//
//Created by just_sort 2016/9/12 16:50
//Copyright (c) 2016 just_sort.All Rights Reserved
//

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 505;
const int maxm = 505;
const int mod  = 1e9+7;
char s[maxn][maxm];
int  dp[2][maxn][maxm];
void add(int &x,int y){
    if((x+=y)>=mod) x-=mod;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) scanf("%s",s[i]+1);
    int t = 0;
    memset(dp[t],0,sizeof(dp[t]));
    dp[t][1][n] = s[n][m]==s[1][1];
    int step = (n+m-2)/2;
    for(int i=1; i<=step; i++){
        memset(dp[!t],0,sizeof(dp[!t]));
        for(int x1=1; x1<=i+1; x1++){
            for(int x2=n; x2>=n-i; x2--){
                int y1 = i+2-x1;
                int y2 = n+m-i-x2;
                if(s[x1][y1]!=s[x2][y2]) continue;
                add(dp[!t][x1][x2],dp[t][x1][x2]);
                add(dp[!t][x1][x2],dp[t][x1][x2+1]);
                add(dp[!t][x1][x2],dp[t][x1-1][x2]);
                add(dp[!t][x1][x2],dp[t][x1-1][x2+1]);
            }
        }
        t = !t;
    }
    int ans = 0;
    for(int i=1; i<=n; i++){
        add(ans,dp[t][i][i]);
        if(n+m & 1) add(ans,dp[t][i][i+1]);
    }
    printf("%d\n",ans);
    return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值