题目背景

还记得NOIP2011的寻宝吗?6年之后,小明带着他的妹子小芳,再次走上了寻宝的道路。

然而这次他们寻宝回来之后,小明被困在了一个迷宫中。

题目描述

迷宫是一个n*m的字符矩阵。

小明在这个矩阵的左上角,只能向下和向右走,去和在矩阵右下角的小芳会合。

小明必须将他走过的路径上的,经过的字符收集起来。如果到右下角时他收集到的这些字符连在一起是回文的,那么他就能够走出这个迷宫,否则他就会掉进陷阱出不来。

小明想知道有多少条路径能够让他走出这个迷宫。由于答案可能很大,请对1000000007取模。

输入输出格式

输入格式:

第一行两个整数n和m。

接下来n行,每行m个字符表示这个矩阵,全部均为小写字母

输出格式:

输出一行一个整数表示答案

输入输出样例

输入样例#1:

3 4
aaab
baaa
abba

输出样例#1:

3

说明

对于20%的数据,满足n∗m≤10

对于另外10%的数据,满足字符都是a

对于70%的数据,满足n,m≤60

对于100%的数据,满足n,m≤500

分析:一道比较考验基本功的dp题.

看到题面就应该能想到状态该怎么表示了,设f[i][j][k][l]表示小明走到了(i,j),小芳走到了(k,l)的方案数,那么该怎么转移呢?显然不能顺着推,因为不知道走过的字符串是啥,如果记录的话会有后效性,那么根据回文字符串的特点,小明从起点走,小芳从终点走,如果两个人所在地方的字符是一样的才能继续走,直到两个人碰面,答案累加,因为空间问题可以过70分.

后30%的数据只能开下500*500的数组,也就是说我们只能够保存两维.那么我们可以保存j和l,枚举当前走了多少步,因为方向一定,所以i和k能够推导出来。因为只保存了列的情况,如果直接推的话会计算重复,那么再开一个数组g,记录前一步的状态,f从g转移而来就可以了.

最后统计答案,如果n+m-1是奇数,那么最后汇合的地点一定是同一行,否则有可能是同一行,也有可能相差一行.

总结:这一类dp问题特征就是给你一个n*m的图,规定走的方向,让你求某些值.状态表示比较有规律,一般就是设f[i][j]表示走到了(i,j)的答案.如果题目变通一下让你走两次,那么可以开四维数组来表示状态.有时候也需要变通一下枚举的顺序,依题目而定,规定了走的方向,我们可以只用保存3维就可以推出第4维,可以优化时间,我们也可以保存2维,这样就需要一个辅助数组记录上一步的状态,既优化了时间,也优化了空间.

#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int mod = 1000000007;int n, m,f[510][510],g[510][510];
int dx[4] = { 1, 0, -1, 0 }, dy[4] = { 0, 1, 0, -1 };
long long ans = 0;
char s[510][510];int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++)scanf("%s", s[i] + 1);if (s[1][1] == s[n][m])f[1][m] = 1;elsef[1][m] = 0;for (int t = 1; t < (n + m) / 2; t++){for (int i = 1; i <= m; i++)for (int j = 1; j <= m; j++){g[i][j] = f[i][j];f[i][j] = 0;}for (int i = 1; i <= m; i++)for (int j = 1; j <= m; j++)if (g[i][j]){int y11 = i, y2 = j, x1 = t - i + 1, x2 = n - t + m - j + 1;for (int k = 0; k < 2; k++){for (int l = 2; l < 4; l++){int nx1 = x1 + dx[k], ny1 = y11 + dy[k];int nx2 = x2 + dx[l], ny2 = y2 + dy[l];if (nx1 > n || ny1 > m || nx2 < 1 || ny2 < 1)continue;if (s[nx1][ny1] == s[nx2][ny2])f[ny1][ny2] = (f[ny1][ny2] + g[i][j]) % mod;}}}}if ((n + m - 1) & 1){for (int i = 1; i <= m; i++)ans = (ans + f[i][i]) % mod;}else{for (int i = 1; i <= m; i++){ans = (ans + f[i][i]) % mod;ans = (ans + f[i][i + 1]) % mod;}}printf("%d\n", ans);
return 0;
}

转载于:https://www.cnblogs.com/zbtrs/p/7586502.html

noip模拟赛 寻宝之后相关推荐

  1. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  2. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  3. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  4. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  5. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  6. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  7. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

  8. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

  9. NOIP模拟赛套路技巧经验总结

    前言 还有2天就NOIP了,之前做了这么多场模拟赛,是时候拿出来总结一下, 算是给自己一针强心剂. 列表 从最近的考试总结起(个人认为的重点,可能有重复,仅供参考): (转化很重要,一定要简化问题过后 ...

最新文章

  1. 自称“房奴”的博士靠开店卖SCI论文10年盈利近百万,论文买卖你怎么看?
  2. RK3288 GMAC整理
  3. Python语言学习之数值、小数、空格那些事:python和数值、小数、空格的使用方法之详细攻略
  4. [译]GLUT教程 - 每秒帧数
  5. JavaSE各阶段练习题----异常
  6. 跟我学《JavaScript高程3》第一讲,视频课程,课程笔记
  7. 【LeetCode笔记】剑指 Offer 57-. 和为s的两个数字 (Java、对撞双指针)
  8. 出发a标签_以用户标签为例,复盘B端产品的需求挖掘方法论
  9. word2vec模型评估_NLP之文本分类:「Tf-Idf、Word2Vec和BERT」三种模型比较
  10. FZU 2108 Mod problem
  11. [惊!] IE 10.0,你没看错! IE10 Platform Preview 1出来啰~
  12. Ubuntu下搭建C/C++开发环境
  13. Qt Creator 使用技巧(功能快捷键如注释、声明和实现之间切换)
  14. 给intellij IDEA设置背景颜色
  15. 大学新颖的软件测试毕业论文题目50例
  16. 汇编语言编译器CmasmW的调试方法
  17. Redis雪崩和Redis穿透
  18. 深度学习实战 2 YOLOv5 添加CBAM、CA、ShuffleAttention注意力机制
  19. 【leetcode】电话号码的字母组合
  20. 沃尔沃旗下豪华纯电动轿跑Polestar 2全球首发

热门文章

  1. react antd 更改table 表头和表行样式
  2. python接口封装_Python 接口测试之接口关键字封装
  3. 获取滑动条高度_HexMap学习笔记(三)——海拔高度与阶梯连接
  4. openmp配置指南_[z]OpenMP编程指南
  5. sql有循环吗_我把 SQL 执行效率提高了 10,000,000 倍!
  6. 计算机辅助教学的开题报告,开题报告样例1(计算机辅助教学)(8页)-原创力文档...
  7. wordpress主题_2014年十大免费WordPress主题
  8. selenium 示例_Selenium findElement和findElements示例
  9. android toast_Android Toast
  10. Akka定义Actors和消息《two》译