#include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<iostream> #include<algorithm> #include<bitset> #include<climits> #include<list> #include<iomanip> #include<stack> #include<set> using namespace std; const int mod=1000000007; char pic[501][501]; int dp[2][501][501]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",pic[i]); int len=(n+m)/2-1; for(int i=0;i<=len;i++) { for(int j=1;j<=n;j++) { int c1=i+2-j; if(c1<=m) { for(int k=n;k>=j;k--) { int c2=n+m-i-k; dp[i&1][j][k]=0; if(c2>=c1&&c2<=m) { if(pic[j-1][c1-1]==pic[k-1][c2-1]) { int id=(i&1),jd=(id^1); if(i==0) dp[id][j][k]=1; else { dp[id][j][k]=dp[jd][j][k]; dp[id][j][k]=(dp[id][j][k]+dp[jd][j-1][k])%mod; dp[id][j][k]=(dp[id][j][k]+dp[jd][j][k+1])%mod; dp[id][j][k]=(dp[id][j][k]+dp[jd][j-1][k+1])%mod; } } } } } } } int id=(len&1),ans=0; for(int i=1;i<=n;i++) ans=(ans+dp[id][i][i])%mod; if((n+m-1)%2==0) for(int i=1;i<=n;i++) ans=(ans+dp[id][i][i+1])%mod; printf("%d",ans); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
codeforces 570 E. Pig and Palindromes
原文:http://blog.csdn.net/stl112514/article/details/47731867