51nod 1503
动态规划
$f[a][b][c][d]$ 表示从 $(1, 1)$ 走到 $(a, b)$ 和从 $(n, m)$ 走到 $(c, d)$ 的方案数
$f[a][b][c][d]$
$= f[a][b - 1][c][d + 1] + f[a][b - 1][c + 1][d] + f[a - 1][b][c + 1][d] + f[a - 1][b][c][d + 1]$
当然这里忽略了判断条件
时空爆炸
考虑如果知道的 $s = a + b, a, c$ 就可以推出 $d$
因此可以压掉一维,时间复杂度 $n ^ 3$
然而空间依旧爆炸
发现 $f[s][*][*]$ 只与 $f[s - 1][*][*]$ 有关
因此只开两个即可
抽离
$f[cur][x1][x2] = (f[cur][x1][x2] + f[cur ^ 1][x1][x2] + f[cur ^ 1][x1 - 1][x2] + f[cur ^ 1][x1][x2 + 1] + f[cur ^ 1][x1 - 1][x2 + 1]) % Mod$
最后 $Ans = \sum_{i = 1}^{n}f[cur][i][i]$
如果 $n + m$ 为奇数
$Ans += \sum_{i = 1}^{n} f[cur][i][i + 1]$
#include <bits/stdc++.h> const int N = , Mod = 1e9 + ; long long f[][N][N], n, m;
char s[N][N]; int main() {
std:: cin >> n >> m;
for(int i = ; i <= n; i ++) scanf("%s", s[i] + );
if(s[][] != s[n][m]) {
puts(""); return ;
}
int cur = ;
f[][][n] = ;
for(int k = ; k <= (n + m - ) / ; k ++) {
cur ^= ;
for(int i = ; i <= n; i ++) for(int j = ; j <= n; j ++) f[cur][i][j] = ;
for(int x1 = ; x1 <= n && x1 - <= k; x1 ++) {
for(int x2 = n; x2 >= && n - x2 <= k; x2 --) {
int y1 = k + - x1, y2 = n + m - k - x2;
if(s[x1][y1] != s[x2][y2]) continue;
f[cur][x1][x2] = (f[cur][x1][x2] + f[cur ^ ][x1][x2] + f[cur ^ ][x1 - ][x2]
+ f[cur ^ ][x1][x2 + ] + f[cur ^ ][x1 - ][x2 + ]) % Mod;
}
}
}
int Ans();
for(int i = ; i <= n; i ++) Ans = (Ans + f[cur][i][i]) % Mod;
if((n + m) % )
for(int i = ; i <= n; i ++) Ans = (Ans + f[cur][i][i + ]) % Mod;
std:: cout << Ans;
return ;
}
51nod 1503的更多相关文章
- 51Nod 1503 猪和回文
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 思路: 没想到要用DP去解决. 题目是从起点出发走,我们可以从起点 ...
- 51nod 1503 多线程dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 1503 猪和回文 题目来源: CodeForces 基准时间限制 ...
- 51nod 1503 猪和回文(dp滚存)
题面 大意:在一个n*m的矩形中从(1,1)走到(n,m)而且走过的路径是一条回文串,统计方案数 sol:我们考虑从(1,1)和(n,m)两端开始算,这样就只要保证每次经过的字符一样就可以满足回文了, ...
- 51nod 1503 猪和回文(多线程DP)
虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...
- 胡小兔的OI日志3 完结版
胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
随机推荐
- linux运维工程师常用命令
1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 通-a,但不列出"."和".."-l 列 ...
- Nginx学习笔记(二):Nginx 连接处理 / 负载均衡
Connection 在 Nginx 中,connection 就是对 TCP 连接的封装,其中包括连接的 socket,读写事件 Nginx 处理连接流程: 解析配置文件,得到需要监听的端口和I ...
- Asp.net core 学习笔记 ( ef core transaction scope & change level )
ef core 有 unit of work 的概念,当我们 save change 时会自动使用 transaction 确保更新的一致性. 隔离级别是默认的 read committed 不允许脏 ...
- MySQL 军规
MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 M ...
- VS2019编译 当前最新版chromium
之前编译过webrtc和chromium, 由于长时间没用,被我删除了, 最近在最新版本的google浏览器上遇到了播放器兼容性问题,老版本的google浏览器是没问题,IE, 火狐浏览器也没问题, ...
- Apache ---- Solrl漏洞复现
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操 ...
- mysql-8.0.16-winx64的最新安装教程
最近刚学习数据库,首先是了解数据库是什么,数据库.数据表的基本操作,这就面临了一个问题,mysql的安装,我这里下载的是64位的,基于Windows的,以下是在我电脑上的安装过程,希望可以帮助到大家. ...
- linux内存管理初学
虚拟内存模型 Linux 内核本身并不运行在虚拟空间中,其使用的是物理寻址模式. 物理内存被分割为界面,一个内存页面的大小由PAGE_SIZE宏决定. 虚拟地址空间的方式使程序员可以将巨大的结构用于连 ...
- Oracle查看表之间的约束
----查看表约束 表格: user_constraints 查询外键约束条件 select ' select count(*) from '||TABLE_NAME||';'from user_co ...
- JFrame windowbuiler的使用基础
一.通过windowbuilder创建java项目: New --Other--windowbuilder--SWT Designer --SWT/JFace Java Project 二.创建文件 ...