这道题还有点意思。

路径要求是一个回文串,回文串立马枚举中点。中点只可能在对角线上。

枚举对角线上的一个点,然后两边的路径必须完全相同。

既然路径上的字符必须完全相同,那么每个前缀也必须完全相同。

考虑 DP。设 \(dp[x1][y1][x2][y2]\) 表示左上方的路径终点在 \((x1,y1)\),右下方的路径终点在 \((x2,y2)\)。

这状态看上去就可以优化,\(dp[k][x1][x2]\),表示 \((x1,k-x1)\) 和 \((x2,k-x2)\)。

然后随便转移一下就差不多了吧。

复杂度 \(O(n^3)\),可以通过。

需要注意滚动数组。

#include<cstdio>
typedef unsigned ui;
const ui M=505,mod=1e9+7;
ui n,dp[2][M][M];char q[M][M],p[M][M];
signed main(){
ui ans(0);
scanf("%u",&n);
for(ui i=1;i<=n;++i)scanf("%s",q[i]+1);
for(ui i=1;i<=n;++i)for(ui j=1;j<=n;++j)p[i][j]=q[n-i+1][n-j+1];
if(q[1][1]!=p[1][1])return printf("0"),0;
dp[0][1][1]=1;
for(ui now(1),lst(0),i=3;i<=n+1;now^=lst^=now^=lst,++i){
for(ui x1=1;x1<i;++x1)for(ui x2=1;x2<i;++x2)dp[now][x1][x2]=0;
for(ui x1=1;x1<i;++x1){
for(ui x2=1;x2<i;++x2)if(q[x1][i-x1]==p[x2][i-x2]){
dp[now][x1][x2]=(dp[lst][x1][x2]+dp[lst][x1-1][x2]+dp[lst][x1][x2-1]+dp[lst][x1-1][x2-1])%mod;
}
}
}
for(ui i=1;i<=n;++i)ans=(ans+dp[n+1&1][i][n+1-i])%mod;
printf("%u",ans);
}

最新文章

  1. 高性能JavaScript 编程实践
  2. LINUX安全加固规范
  3. [转]LUA元表
  4. 当spring 容器初始化完成后执行某个方法 防止onApplicationEvent方法被执行两次
  5. jQuery 插件模板
  6. Java NIO 缓冲技术详解
  7. html》meta标签笔记
  8. web开发中的多线程死锁问题,避免死锁
  9. JavaEE开发之记事本完整案例(SpringBoot + iOS端)
  10. Argparse4j
  11. BZOJ 2169
  12. week1 - Python基础1 介绍、基本语法、流程控制
  13. NoSuchMethodError: The getter &#39;inputs&#39; was called on null.
  14. gitlab提交代码
  15. hdu 6069 Counting Divisors(求因子的个数)
  16. String引用数据类型
  17. Linux安装Broadcom无线驱动
  18. iOS-引用计数与ARC(转)
  19. ajax访问遇到Session失效问题
  20. 微信小程序 - 上拉加载下拉刷新

热门文章

  1. MAC OS 常用快捷键
  2. root登陆530 Permission denied、530 Login incorrect解决
  3. IDEA中Git的一般使用场景
  4. java+selenium自动化脚本编写
  5. Spring Boot自动配置SpringMVC(二)
  6. 扫盲贴:2021 CSS 最冷门特性都是些啥?
  7. 如何使用 Rancher Desktop 访问 Traefik Proxy 仪表板
  8. [题解]Codeforces Round #519 - A. Elections
  9. 报表工具Smartbi有什么过人之处?为什么这两年备受推崇?
  10. springboot项目 @Scheduled注解 实现定时任务