[51nod1503]猪和回文 DP
题解:
首先观察到题目要求的是合法回文串的个数,而回文串要求从前往后和从后往前是一样的,因此我们假设有两只猪,分别从左上和右下开始走,走相同的步数最后相遇,那么它们走的路能拼在一起构成一个回文串,当且仅当它们走字符串是完全相同的。
那么我们可以根据这个性质进行DP,设f[i][j][k][l]表示第一只猪走到(i, j),第二只猪走到(k, l)的方案数。
那么观察到$i + j = k + l$,所以$l$是没必要记录的,因为前面三个确定,l就确定了,然后因为i从1 开始枚举,每次只能走一步,所以只会用到上一步的方案,所以可以滚动一下,这样时空复杂度就都可以承受了。
因为要限制两只猪走的步数一样,注意限制第一只猪在红色的三角形中,另一只猪在蓝色的三角形中。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 510
#define mod 1000000007
#define LL long long int n, m;
LL f[][AC][AC], ans;
char s[AC][AC]; void pre()
{
scanf("%d%d", &n, &m);
for(R i = ; i <= n; i ++) scanf("%s", s[i] + );
if(s[][] != s[n][m]) {printf("0\n"); exit();}
} inline bool check(int i, int j, int k, int l)
{
if(i == k && j == l) return true;
else if(i + == k && j == l) return true;
else if(i == k && j + == l) return true;
return false;
} void work()
{
int l, now = , b = (n + m) / ;
f[][][n] = ;
for(R i = ; i <= n; i ++, now ^= )
{
for(R j = ; j + i - <= b; j ++)
{
if(i == && j == ) continue;
for(R k = n; k >= i; k --)
{
l = n + m + - i - j - k;
if(l < j || l > m) continue;
if(s[i][j] != s[k][l]) continue;
f[now][j][k] = f[now ^ ][j][k] + f[now ^ ][j][k + ];
f[now][j][k] += f[now][j - ][k] + f[now][j - ][k + ];
f[now][j][k] %= mod;
if(check(i, j, k, l)) ans += f[now][j][k];
if(ans > mod) ans -= mod;
}
}
memset(f[now ^ ], , sizeof(f[now ^ ]));//因为有同层转移,所以要memset,而不能枚举到它的时候再重置
}
printf("%lld\n", ans);
} void work1()
{
int l, now = , b = (n + m) / ;
f[][][n] = ;
for(R i = ; i <= n; i ++, now ^= )
{
for(R j = ; j + i - <= b; j ++)
{
if(i == && j == ) continue;
for(R k = n; k >= i; k --)
{
l = n + m + - i - j - k;
if(l < j || l > m) continue;
if(s[i][j] != s[k][l]) continue;
f[i][j][k] += f[i - ][j][k] + f[i - ][j][k + ];
f[i][j][k] += f[i][j - ][k] + f[i][j - ][k + ];
f[i][j][k] %= mod;
if(check(i, j, k, l)) ans += f[i][j][k];
if(ans > mod) ans -= mod;
}
}
}
printf("%lld\n", ans);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}
[51nod1503]猪和回文 DP的更多相关文章
- 1503 猪和回文(DP)
1503 猪和回文 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有 ...
- 51nod-1503 猪和回文 - 二维矩阵上的dp
题目链接 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表示. 刚开 ...
- 51nod 1503 猪和回文(dp滚存)
题面 大意:在一个n*m的矩形中从(1,1)走到(n,m)而且走过的路径是一条回文串,统计方案数 sol:我们考虑从(1,1)和(n,m)两端开始算,这样就只要保证每次经过的字符一样就可以满足回文了, ...
- 51nod 1503 猪和回文(多线程DP)
虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...
- 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 & ...
- 51Nod 1503 猪和回文
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 思路: 没想到要用DP去解决. 题目是从起点出发走,我们可以从起点 ...
- 1154 回文串划分(DP+Manacher)
1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. ...
随机推荐
- tp5多条件查询
->where('m.user_nickname|w.nickname|c.companyname','like','%'.$search.'%')\
- PHP----composer安装和TP5验证码类
妈的,想用TP5做个项目,用到登录验证码了,结果煞笔TP5不内置了,需要用Composer,用吧,来下载 1.安装Composer 1.1 更新 sudo apt-get update 1.2 安装w ...
- POJ1236_A - Network of Schools _强连通分量::Tarjan算法
Time Limit: 1000MS Memory Limit: 10000K Description A number of schools are connected to a compute ...
- python2.X与python3.X爬虫常用的模块变化对应
python2 python3 import urllib2 import urllib.request,urllib.error import urllib.request,urllib.error ...
- python, pycharm, virtualenv 的使用
创建虚拟环境,一次安装多个库 pip freeze > requirements.txt (库的名字都在里面) 产生requirements.txt文件 在另一个环境下使用 pip instal ...
- Linux 之vi与vim
vi 三种模式: 『一般模式』: 光标 『编辑模式』:i,o,a,r 『指令列命令模式』「:/ ?」 例子: 1. 请在/tmp 这个目录下建立一个名为vitest 的目录: 2. 将/etc/man ...
- HBase import tsv,csv File
一,HBase中创建table 表(liupeng:test)并创建 info ,contect 列簇 hbase(main):258:0> create "liupeng:Test& ...
- windows 系统禁止使用 U 盘的方法
windows 系统禁止使用 U 盘的方法 最简单的办法: 注册表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentCntrolSet\Services\USBSTOR] 将名为 ...
- android 怎么判断activity 从哪里启动的
有时候,你想要知道,有一个activity 从哪里启动的.怎么才能知道呢? 1.前提是,androidstadio 你下载了源码.找到你的activityBase的实现类,在startActivity ...
- Hibernate-ORM:01.Hibernate恍如隔世般初见
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 对于学过ORM框架的朋友来说,上手HibernateORM来说,既熟悉有有一点陌生,熟悉无非是灵魂相通,陌生的 ...