题解 P3126 【[USACO15OPEN]回文的路径Palindromic Paths】
P3126 [USACO15OPEN]回文的路径Palindromic Paths
看到这题题解不多,蒟蒻便想更加通俗易懂地分享一点自己的心得,欢迎大佬批评指正_
像这种棋盘形的两边同时做的dp还有
P1006 传纸条,
P1004 方格取数,
T35377 大教室中传纸条
一、思路改进
对于这种题目最暴力的方法无非是分别枚举左上角和右下角两点坐标
(f[ i ][ j ][ k ][ l ] = f[ i-1 ][ j ][ k+1 ][ l ] + f[ i-1 ][ j ][ k ][ l+1 ] + f[ i ][ j-1 ][ k+1 ][ l ] + f[ i ][ j-1 ][ k ][ l+1 ])
一起往中间走,即当两个点重合时便有了路径——O(n^4),像这种数据较大的题会爆
于是便有了新的思路,由于两点是一起走的,步数相同,所以可以枚举步数,又因为横纵坐标之和等于所走路径长+1(横纵坐标会重合一点,可以看下图理解),所以只需枚举两点的横坐标(j,k)就可以求出两点的纵坐标
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 1 | 左上角 | E | |||
| 2 | D | ||||
| 3 | C | ||||
| 4 | B | ||||
| 5 | A | 右下角 |
i表示步数(注:左上角和右下角只有一种走法,我们可以从第二步开始走,又因为横纵坐标重合一点,为了使横坐标+纵坐标=i,我们可以从3开始枚举)
上图字母是路径长为5,i(所枚举的步数)为5+1=6的情况
设j为左边点的横坐标(纵坐标为i-j),k为右边点所走路径的竖直长【如上图点A,枚举到它时k为1,横坐标为n-(i-k)+1=n-i+k+1=5-6+1+1=1,纵坐标为n-k+1=5-1+1=5】
即f(i,j,k)=f(i-1,j,k)+f(i-1,j-1,k)+f(i-1,j,k-1)+f(i-1,j-1,k-1)【j-1,而i不变,说明点的纵坐标+1,其实这个式子与上面暴力的式子是一样的】
二、空间优化
然而,这题数据范围到了500,如果开500^3的数组会MLE,考虑到每次状态转移只需用到f(i-1,j,k),可以用滚动数组优化空间
逆序枚举j、k【f[j][k]=f[j][k]+f[j-1][k-1]+f[j-1][k]+f[j][k-1]等式左侧步数为i,而右侧其实是上次枚举的状态,步数为i-1】(与01背包的滚动数组优化同理)即可避免覆盖还未转移的状态。
三、代码
只有两点字母相同时才能走,因此当两点字母不同时方案数为0,否则为每个可以走过来的状态的方案数之和
具体细节可以在代码中进一步理解
#include<iostream>
#define rint register int
using namespace std;
char a[501][501];
int n;
long long f[501][501],ans;
int main() {
cin>>n;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
cin>>a[i][j];
if (a[1][1]!=a[n][n]) {
cout<<0;
return 0;
}//如果左上角和右下角字母不同则无解
f[1][1]=1;//当两点分别处于左上角和右下角时方案为1
for (rint i=3; i<=n+1; i++)
for (rint j=i-1; j>=1; j--)
for (rint k=i-1; k>=1; k--) {
if (a[j][i-j]==a[n-i+k+1][n-k+1])//(用j,k分别求出所对应的横纵坐标)此两点字母是否相同?
f[j][k]=(f[j][k]+f[j-1][k-1]+f[j-1][k]+f[j][k-1])%1000000007;
else f[j][k]=0;//不相同则方案为0
}
for (int i=1; i<=n; i++)//统计所有方案数
ans=(ans+f[i][i])%1000000007;//当j=k说明两点重合
cout<<ans;
}
题解 P3126 【[USACO15OPEN]回文的路径Palindromic Paths】的更多相关文章
- [USACO15OPEN]回文的路径Palindromic Paths
[USACO15OPEN]回文的路径Palindromic Paths 题目描述 Farmer John's farm is in the shape of an N \times NN×N grid ...
- [USACO15OPEN]回文的路径Palindromic Paths 2.0版
题目描述 农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记.比如说: ABCD BXZX CDXB WCBA 某一天,FJ从农场的左上角走到右 ...
- 洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares
P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交 讨论 题解 最新讨论 暂时没有 ...
- [译+改]最长回文子串(Longest Palindromic Substring) Part II
[译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...
- [译]最长回文子串(Longest Palindromic Substring) Part I
[译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...
- 领扣-5 最长回文子串 Longest Palindromic Substring MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- USACO 回文的路径
传送门 这道题和传纸条在某些方面上非常的相似.不过这道题因为我们要求回文的路径,所以我们可以从中间一条大对角线出发去向两边同时进行DP. 这里就有了些小小的问题.在传纸条中,两个路径一定是同时处在同一 ...
- 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares
P1206 [USACO1.2]回文平方数 Palindromic Squares 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2< ...
- Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)
Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...
随机推荐
- 比快更快——微软LightGBM
LightGBM介绍 xgboost是一种优秀的boosting框架,但是在使用过程中,其训练耗时过长,内存占用比较大.微软在2016年推出了另外一种boosting框架--lightgbm,在不降低 ...
- mysql自动安装教程说明
这里只说明了思路和方法 我们在安装程序里面可能需要安装的时候将mysql一起安装,那么我们就按照下面的顺序思路来. 首先我们安装的电脑上可能已经安装了mysql,所以我们的mysql服务就起一个名字, ...
- Vista之前的版本,默认本地登陆用户都以管理员权限启动程序
Vista之前的版本,默认本地登陆用户都以管理员权限启动程序,之后的OS版本默认都没有管理员权限,需要用户提权才能做某些操作,否则需要管理员权限的操作都会失败MSSQL是用户名账号连接,Socket方 ...
- admin组件的使用
导进来的模板不能直接放到static里,要从其他的地方移动到static里,否则pycharm不能自动改变路径2.自关联class Userunfo(models.Model): title=m ...
- javaweb各种框架组合案例(二):maven+spring+springMVC+mybatis
1.mybatis是比较新的半自动orm框架,效率也比较高,优点是sql语句的定制,管理与维护,包括优化,缺点是对开发人员的sql功底要求较高,如果比较复杂的查询,表与表之间的关系映射到对象与对象之间 ...
- CDMA子钟
SYN6103型 CDMA子钟 产品概述 SYN6103型CDMA子钟是由西安同步电子科技有限公司精心设计.自行研发生产的一套从CDMA网络获取标准时间信号信息的子钟,能方便部署在任何有CDMA信号的 ...
- java集合框架collection(2)ArrayList和LinkedList
ArrayList是基于动态数组实现的list,而LinkedList是基于链表实现的list.所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性. 优缺点 ArrayLi ...
- Spring-Boot + MyBatis-Plus 踩坑记录
这两天在学SpringBoot+MyBatis的开发,配置开发环境和DEMO的过程中踩了很多坑,在这里记录一下. 我的开发环境是idea + JDK 1.8.0.211. 首先展示一下demo的项目整 ...
- kubernetes实战篇之Dashboard的访问权限限制
系列目录 前面我们的示例中,我们创建的ServiceAccount是与cluster-admin 绑定的,这个用户默认有最高的权限,实际生产环境中,往往需要对不同运维人员赋预不同的权限.而根据实际情况 ...
- IDEA的参数配置
配置默认JDK 2.默认Project是没有JDK的,需要手动添加,然后才会有选项 关闭Intellij IDEA自动更新 文件编码设置 改快捷键,模板,注释,自动导包,创建web项目卡顿参数修改,代 ...