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 相离的圆 基 ...
随机推荐
- goroutine基础
程序1: package main import ( "fmt" "time" ) func test () { var i int for { fmt.Pri ...
- css 样式合集
td换行: style="word-wrap:break-word;word-break:break-all;" 超长省略号: table { table-layout: fixe ...
- CSS定位以及z-index属性(层叠性)的详解(转)
https://blog.csdn.net/weixin_41342585/article/details/79484879
- ABP的UnitOfWork内部SaveChanges无效
应用层一个AppService默认是一个工作单元,默认是开启的,默认是事务的.因为应用服务方法应该是原子的且一般都会使用数据库. 但是有些情况需要关闭工作单元 1.AppService有多个操作需要操 ...
- Java链表设计
链表 1,链表的实现 在实际开发之中对象数组是一项非常实用的技术,并且利用其可以描述出“多”方的概念,例如:一个人有多本书,则在人的类里面一定要提供有一个对象数组保存书的信息,但是传统的对象数组依赖于 ...
- Java框架 高并发系列 1第1天:必须知道的几个概念
https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933019&idx=1&sn=3455877c451de9 ...
- 可视化利器 TensorBoard
人工智能的黑盒: TensorBoard 的作用: 1.用TensorFlow保存图的信息到日志中 tfsummary.FileWriter("日志保存路径", sess.grap ...
- 决心学HTML 第一晚
老师数他的审美观不行,怕教的我们的审美观也不行,所以,就不讲HTML了,但是期末又要考, 自己英语又不行,期末做项目又要用,我可能又要做组长,只能硬着头皮自学了. 所以,现在从第一页开始学!!! 这这 ...
- tf 2.0
tf.function和Autograph使用指南-Part 1 "Keras之父发声:TF 2.0 + Keras 深度学习必知的12件事" Effective TensorFl ...
- VBA运算符(九)
运算符可以用一个简单的表达式定义,例如:4 + 5等于9.这里,4和5称为操作数,+被称为运算符.VBA支持以下类型的运算符 - 算术运算符 比较运算符 逻辑(或关系)运算符 连接运算符 算术操作符 ...