LGP3126题解
2024-09-24 05:41:23
这道题还有点意思。
路径要求是一个回文串,回文串立马枚举中点。中点只可能在对角线上。
枚举对角线上的一个点,然后两边的路径必须完全相同。
既然路径上的字符必须完全相同,那么每个前缀也必须完全相同。
考虑 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);
}
最新文章
- 高性能JavaScript 编程实践
- LINUX安全加固规范
- [转]LUA元表
- 当spring 容器初始化完成后执行某个方法 防止onApplicationEvent方法被执行两次
- jQuery 插件模板
- Java NIO 缓冲技术详解
- html》meta标签笔记
- web开发中的多线程死锁问题,避免死锁
- JavaEE开发之记事本完整案例(SpringBoot + iOS端)
- Argparse4j
- BZOJ 2169
- week1 - Python基础1 介绍、基本语法、流程控制
- NoSuchMethodError: The getter &#39;inputs&#39; was called on null.
- gitlab提交代码
- hdu 6069 Counting Divisors(求因子的个数)
- String引用数据类型
- Linux安装Broadcom无线驱动
- iOS-引用计数与ARC(转)
- ajax访问遇到Session失效问题
- 微信小程序 - 上拉加载下拉刷新
热门文章
- MAC OS 常用快捷键
- root登陆530 Permission denied、530 Login incorrect解决
- IDEA中Git的一般使用场景
- java+selenium自动化脚本编写
- Spring Boot自动配置SpringMVC(二)
- 扫盲贴:2021 CSS 最冷门特性都是些啥?
- 如何使用 Rancher Desktop 访问 Traefik Proxy 仪表板
- [题解]Codeforces Round #519 - A. Elections
- 报表工具Smartbi有什么过人之处?为什么这两年备受推崇?
- springboot项目 @Scheduled注解 实现定时任务