动态规划

$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的更多相关文章

  1. 51Nod 1503 猪和回文

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 思路: 没想到要用DP去解决. 题目是从起点出发走,我们可以从起点 ...

  2. 51nod 1503 多线程dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 1503 猪和回文 题目来源: CodeForces 基准时间限制 ...

  3. 51nod 1503 猪和回文(dp滚存)

    题面 大意:在一个n*m的矩形中从(1,1)走到(n,m)而且走过的路径是一条回文串,统计方案数 sol:我们考虑从(1,1)和(n,m)两端开始算,这样就只要保证每次经过的字符一样就可以满足回文了, ...

  4. 51nod 1503 猪和回文(多线程DP)

    虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...

  5. 胡小兔的OI日志3 完结版

    胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...

  6. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  7. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  8. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  9. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

随机推荐

  1. SAS学习笔记35 options语句

  2. MogileFS与spring结合

    一.通过Maven添加MogileFS的Java客户端驱动包 <dependency> <groupId>fm.last</groupId> <artifac ...

  3. (十一)springmvc和spring的整合

    1:Maven引入相关的jar包. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  4. (十一)web服务与javaweb结合(2)

    一.解决问题及解决方法 解决问题:上章节用监听器的方式是有缺陷的:web服务的端口和web工程的端口不能一致. 解决方案:将webService绑定到web工程中,使得共用一个端口. 二.案例 2.1 ...

  5. R语言错误的提示(中英文翻译)

    # Chinese translations for R package # Copyright (C) 2005 The R Foundation # This file is distribute ...

  6. docker 学习1 WSL docker ,Windows docker

    获取Linux内核版本 //使用 lsb_release -a 可见我电脑上的 WSL Linux 版本是 Ubuntu的. 安装docker for ubuntu (遇到问题) 转[http://b ...

  7. web.xml 转 学习!http://www.cnblogs.com/wkrbky/p/5929943.html

    1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在web.xml配置监听器ContextLoaderListener(l ...

  8. 校验用户名是否存在(ajax+jackson)

    只是简单的仿某度注册的用户名输入离焦后检验 目录结构 没有涉及到数据库 html <!DOCTYPE html> <html lang="en"> < ...

  9. datagrid行内编辑

    编辑属性 :editor: { type: 'text'} $('#listShow').datagrid({ height : 478, pagesize : 20, pageList : [20, ...

  10. docker 部署 elasticsearch + elasticsearch-head + elasticsearch-head跨域问题 + IK分词器

    0.  docker pull 拉取elasticsearch + elasticsearch-head 镜像 1.  启动elasticsearch Docker镜像 docker run -di ...