1503 猪和回文(DP)
一只猪走进了一个森林。很凑巧的是,这个森林的形状是长方形的,有n行,m列组成。我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m。处于第r行第c列的格子用(r,c)表示。
刚开始的时候猪站在(1,1),他的目标是走到(n,m)。由于猪回家心切,他在(r,c)的时候,只会往(r+1,c)或(r,c+1)走。他不能走出这个森林。
这只猪所在的森林是一个非同寻常的森林。有一些格子看起来非常相似,而有一些相差非常巨大。猪在行走的过程中喜欢拍下他经过的每一个格子的照片。一条路径被认为是漂亮的当且仅当拍下来的照片序列顺着看和反着看是一样的。也就是说,猪经过的路径要构成一个回文。
数一数从(1,1)到(n,m)有多少条漂亮路径。答案可能非常巨大,请输出对 109+7 取余后的结果。
样例解释:有三种可能
 
 
单组测试数据。
第一行有两个整数 n,m (1≤n,m≤500),表示森林的长和宽。
接下来有n行,每行有m个小写字母,表示每一个格子的类型。同一种类型用同一个字母表示,不同的类型用不同的字母表示。
输出答案占一行。
3 4
aaab
baaa
abba
3 //没什么好办法,暴力是不可能的,想贡献也想不出,动态规划,好像有点感觉,但是想不清楚,唉,
设 dp[i][j][k][z] 为,从(1,1) 走右和下走到 (i,j) ,从(n,m)走左和上到(k,z) ,并且路径上的字符完全相同的种数
容易得到:
dp[i][j][k][z] += dp[i-1][j][k+1][z];
dp[i][j][k][z] += dp[i-1][j][k][z+1];
dp[i][j][k][z] += dp[i][j-1][k+1][z];
dp[i][j][k][z] += dp[i][j-1][k][z+1];
可以发现的是,只需要 dp[i] 和 dp[i-1] ,所以滚动数组优化一维
如果 i j k 知道了的话 z 可以算出,所以再去掉一维,就完美解决这个问题了
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define MOD 1000000007
#define MX 505 int n, m;
char dat[MX][MX];
LL dp[][MX][MX]; int check(int x,int y,int k,int z)
{
if (x==k&&y==z) return ;
if (x+==k&&y==z) return ;
if (x==k&&y+==z) return ;
return ;
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%s",dat[i]+);
}
if (dat[][]==dat[n][m])
dp[][][n]=;
LL ans = ;
for (int i=;i<=n;i++)
{
for (int j=;(i+j-)<=(n+m)/;j++)
{
for (int k=n;n+m+-i-j-k<=m;k--)
{
int z = n+m+-i-j-k;
if (dat[i][j]==dat[k][z])
{
dp[i%][j][k] += dp[(i-)%][j][k+];
dp[i%][j][k] += dp[(i-)%][j][k];
dp[i%][j][k] += dp[i%][j-][k+];
dp[i%][j][k] += dp[i%][j-][k];
dp[i%][j][k] %= MOD;
if (check(i,j,k,z))
ans = (ans+dp[i%][j][k])%MOD;
}
}
}
memset(dp[(i-)%],,sizeof(dp[(i-)%]));
}
printf("%lld\n",ans);
return ;
}
1503 猪和回文(DP)的更多相关文章
- 51nod 1503 猪和回文(多线程DP)
		
虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...
 - 51nod 1503 猪和回文(dp滚存)
		
题面 大意:在一个n*m的矩形中从(1,1)走到(n,m)而且走过的路径是一条回文串,统计方案数 sol:我们考虑从(1,1)和(n,m)两端开始算,这样就只要保证每次经过的字符一样就可以满足回文了, ...
 - [51nod1503]猪和回文 DP
		
---题面--- 题解: 首先观察到题目要求的是合法回文串的个数,而回文串要求从前往后和从后往前是一样的,因此我们假设有两只猪,分别从左上和右下开始走,走相同的步数最后相遇,那么它们走的路能拼在一起构 ...
 - 51Nod 1503 猪和回文
		
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 思路: 没想到要用DP去解决. 题目是从起点出发走,我们可以从起点 ...
 - 51nod-1503 猪和回文 - 二维矩阵上的dp
		
题目链接 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表示. 刚开 ...
 - NYOJ 1023 还是回文(DP,花最少费用形成回文串)
		
/* 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 那么,将字符串变成回文串的最小花费是多少呢? 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字 ...
 - SCUT125 华为杯 D.笔芯回文 —— DP
		
题目链接: https://scut.online/p/125 题目描述 bxbx有一个长度一个字符串SS,bxbx可以对其进行若干次操作. 每次操作可以删掉一个长度为k(1 \leq k \leq ...
 - 【LSGDOJ1383】修改回文 dp
		
题目描述 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M & ...
 - codeforce 570 problem E&& 51Nod-1503-猪和回文
		
1503 猪和回文 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表 ...
 
随机推荐
- JavaScript——中的prototype(原型)
			
JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...
 - python抓包截取http记录日志
			
#!/usr/bin/python import pcap import dpkt import re def main(): pc=pcap.pcap(name="eth1" ...
 - Spring 配置dataSource和sessionFactory
			
记得导入dbcp和pool的jar包. <?xml version="1.0" encoding="UTF-8"?> <beans xml ...
 - SVN学习(一)——SVN 检出文件步骤、图标显示及含义
			
May, I come... 1. 创建一个目录用来存放检出得到的文件,例如MyCRM 2. 直接进入目录MyCRM,点右键 3. 可以看到检出得到的文件 此时文件图标上没有任何标识.可能你会想到通过 ...
 - centos mysql iptables配置
			
在CentOS系统中防火墙默认是阻止3306端口的,我们要是想访问mysql数据库,我们需要这个端口,命令如下: iptables -I INPUT -p tcp --dport 3036 -j AC ...
 - 今日头条&58转转笔试
			
昨天参加今日头条和58转转的笔试,因为时间上有冲突,所以主要选择参加头条的笔试. 先说头条: 头条的题型: 一道改错题 三道编程题 一道设计题 感受: 做题目的的时候还是有点紧张的,因为突然遇到题目需 ...
 - TensorFlow学习笔记 速记2 报错:failed call to cuDevicePrimaryCtxRetain: CUDA_ERROR_INVALID_DEVICE
			
版本: tensorflow-gpu 原因: 在创建session时没有使用我想让它用的gpu 解决方案: 1. 在python程序中: import os os.environ["CUDA ...
 - php模板原理PHP模板引擎smarty模板原理浅谈
			
mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...
 - java正则表达式基础知识(转)
			
1基础 2.1 简单字符类 构造 描述 [abc] a,b或c [^abc] 除a,b或c外的字符 [a-zA-Z] a至z 或 A至Z [a-d[m-p]] a至d 或 m至p [a-z&& ...
 - eclipse进行远程调试教程,轻松搞定生产环境问题
			
首先你本地Eclipse上要有和部署在远程服务器一至的项目,否则debug的时候会出现代码行错位,难以达到debug的效果.例如:如果你本地的代 码加了行,修改了,或减了一行.而远程服务器上的项目没有 ...