CF 316 E. Pig and Palindromes 求左上角走到右下角是回文的方法数 DP
2015-08-29 16:08
495 查看
题意:给一个n*m的格子,每个格子有一个字母,只有向下和向左两种走法,现在要求,从左上角走到右下角,走过的格子的字母是回文的有多少种走法?
DP,枚举步数,因为是回文串,所以应该是对称的,步数应该为(n+m)2向下取整,可以知道,以左上角为起点走,走step步,走到的点是固定的,假设从左上角走到(r1,c1)这个点,并且走了step步,那么明显有r1+c1=step+1(由(1,1)走到(r1,c1)),从右下角走到(r2,c2)这个点,并且走了step步,那么明显有r2+c2=n+m+1−step(由(n,m)走到(r2,c2)),那么对于每一个c1和c2都直接用公式算出对应的r1和r2,对于每一个step,枚举(c1,r1)和(c2,r2),第step步由step+1递推而来。。可以用滚动数组节约空间。
代码:
DP,枚举步数,因为是回文串,所以应该是对称的,步数应该为(n+m)2向下取整,可以知道,以左上角为起点走,走step步,走到的点是固定的,假设从左上角走到(r1,c1)这个点,并且走了step步,那么明显有r1+c1=step+1(由(1,1)走到(r1,c1)),从右下角走到(r2,c2)这个点,并且走了step步,那么明显有r2+c2=n+m+1−step(由(n,m)走到(r2,c2)),那么对于每一个c1和c2都直接用公式算出对应的r1和r2,对于每一个step,枚举(c1,r1)和(c2,r2),第step步由step+1递推而来。。可以用滚动数组节约空间。
代码:
//author: CHC //First Edit Time: 2015-08-29 15:06 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <set> #include <vector> #include <map> #include <queue> #include <set> #include <algorithm> #include <limits> using namespace std; typedef long long LL; const int MAXN=510; const int INF = numeric_limits<int>::max(); const LL LL_INF= numeric_limits<LL>::max(); const int mod=1e+9 + 7; LL dp[2][MAXN][MAXN]; int n,m; char mapp[MAXN][MAXN]; bool check(int x){ return x>=1&&x<=n; } int main() { while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++) scanf(" %s",mapp[i]+1); int k=0; for(int step=(n+m)/2;step>0;step--){ k^=1; for(int c1=1;c1<=m;c1++){ for(int c2=c1;c2<=m;c2++){ int r1=step-c1+1; int r2=n+m-step-c2+1; if(!(check(r1)&&check(r2)&&r1<=r2))continue; //printf("step:%d %d %d %d %d\n",step,r1,c1,r2,c2); if(mapp[r1][c1]==mapp[r2][c2]){ if(r1==r2&&c1==c2)dp[k][c1][c2]=1; else if(r1==r2&&c1+1==c2)dp[k][c1][c2]=1; else if(r1+1==r2&&c1==c2)dp[k][c1][c2]=1; else dp[k][c1][c2]=(dp[k^1][c1+1][c2]+dp[k^1][c1+1][c2-1]+dp[k^1][c1][c2-1]+dp[k^1][c1][c2])%mod; } else dp[k][c1][c2]=0; } } } printf("%I64d\n",dp[k][1][m]%mod); } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- 用while判断输入的数字是否回文数的简单实现
- php找出指定范围内回文数且平方根也是回文数的方法
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow