题目来源: CodeForces
基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

一只猪走进了一个森林。很凑巧的是,这个森林的形状是长方形的,有n行,m列组成。我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m。处于第r行第c列的格子用(r,c)表示。

刚开始的时候猪站在(1,1),他的目标是走到(n,m)。由于猪回家心切,他在(r,c)的时候,只会往(r+1,c)或(r,c+1)走。他不能走出这个森林。

这只猪所在的森林是一个非同寻常的森林。有一些格子看起来非常相似,而有一些相差非常巨大。猪在行走的过程中喜欢拍下他经过的每一个格子的照片。一条路径被认为是漂亮的当且仅当拍下来的照片序列顺着看和反着看是一样的。也就是说,猪经过的路径要构成一个回文。

数一数从(1,1)到(n,m)有多少条漂亮路径。答案可能非常巨大,请输出对 109+7 取余后的结果。

样例解释:有三种可能

  

Input
  1. 单组测试数据。
  2. 第一行有两个整数 n,(1n,m500),表示森林的长和宽。
  3. 接下来有n行,每行有m个小写字母,表示每一个格子的类型。同一种类型用同一个字母表示,不同的类型用不同的字母表示。
Output
  1. 输出答案占一行。
Input示例
  1. 3 4
  2. aaab
  3. baaa
  4. abba
Output示例
  1. 3
  2.  
  3. //没什么好办法,暴力是不可能的,想贡献也想不出,动态规划,好像有点感觉,但是想不清楚,唉,
    dp[i][j][k][z] 为,从(1,1) 走右和下走到 (i,j) ,从(n,m)走左和上到(k,z) ,并且路径上的字符完全相同的种数
    容易得到:
      dp[i][j][k][z] += dp[i-1][j][k+1][z];
      dp[i][j][k][z] += dp[i-1][j][k][z+1];
      dp[i][j][k][z] += dp[i][j-1][k+1][z];
      dp[i][j][k][z] += dp[i][j-1][k][z+1];
    可以发现的是,只需要 dp[i] dp[i-1] ,所以滚动数组优化一维
    如果 i j k 知道了的话 z 可以算出,所以再去掉一维,就完美解决这个问题了
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. #define MOD 1000000007
  5. #define MX 505
  6.  
  7. int n, m;
  8. char dat[MX][MX];
  9. LL dp[][MX][MX];
  10.  
  11. int check(int x,int y,int k,int z)
  12. {
  13. if (x==k&&y==z) return ;
  14. if (x+==k&&y==z) return ;
  15. if (x==k&&y+==z) return ;
  16. return ;
  17. }
  18.  
  19. int main()
  20. {
  21. scanf("%d%d",&n,&m);
  22. for (int i=;i<=n;i++)
  23. {
  24. scanf("%s",dat[i]+);
  25. }
  26. if (dat[][]==dat[n][m])
  27. dp[][][n]=;
  28. LL ans = ;
  29. for (int i=;i<=n;i++)
  30. {
  31. for (int j=;(i+j-)<=(n+m)/;j++)
  32. {
  33. for (int k=n;n+m+-i-j-k<=m;k--)
  34. {
  35. int z = n+m+-i-j-k;
  36. if (dat[i][j]==dat[k][z])
  37. {
  38. dp[i%][j][k] += dp[(i-)%][j][k+];
  39. dp[i%][j][k] += dp[(i-)%][j][k];
  40. dp[i%][j][k] += dp[i%][j-][k+];
  41. dp[i%][j][k] += dp[i%][j-][k];
  42. dp[i%][j][k] %= MOD;
  43. if (check(i,j,k,z))
  44. ans = (ans+dp[i%][j][k])%MOD;
  45. }
  46. }
  47. }
  48. memset(dp[(i-)%],,sizeof(dp[(i-)%]));
  49. }
  50. printf("%lld\n",ans);
  51. return ;
  52. }
  1.  
  1.  
  1.  

1503 猪和回文(DP)的更多相关文章

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

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

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

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

  3. [51nod1503]猪和回文 DP

    ---题面--- 题解: 首先观察到题目要求的是合法回文串的个数,而回文串要求从前往后和从后往前是一样的,因此我们假设有两只猪,分别从左上和右下开始走,走相同的步数最后相遇,那么它们走的路能拼在一起构 ...

  4. 51Nod 1503 猪和回文

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

  5. 51nod-1503 猪和回文 - 二维矩阵上的dp

    题目链接 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表示. 刚开 ...

  6. NYOJ 1023 还是回文(DP,花最少费用形成回文串)

    /* 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 那么,将字符串变成回文串的最小花费是多少呢? 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字 ...

  7. SCUT125 华为杯 D.笔芯回文 —— DP

    题目链接: https://scut.online/p/125 题目描述 bxbx有一个长度一个字符串SS,bxbx可以对其进行若干次操作. 每次操作可以删掉一个长度为k(1 \leq k \leq ...

  8. 【LSGDOJ1383】修改回文 dp

    题目描述 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M & ...

  9. codeforce 570 problem E&& 51Nod-1503-猪和回文

    1503 猪和回文 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表 ...

随机推荐

  1. Request.Cookies使用方法分析

    本文章介绍了Request.Cookies的基本的语法和使用方法. 而且通过演示样例分析了Request.Cookies的使用过程. Request.Cookies方法能够检索Cookies 集合中的 ...

  2. 修改注册表实现Windows自动登陆

    昨天再修一条case时无意间发现这个case竟然要重启机器,并且要用指定的账户自动登陆Windows.然后就发现了,简单的修改下注册表就可以完成自动登陆了. 首先,在“run”里输入“regedit” ...

  3. Android应用TranslateAnimation移动之后,利用视图的setLayoutPara

    Android中利用TranslateAnimation移动时,不设置mTranslateAnimation.setFillAfter(true);,而利用视图的setLayoutParams来重新定 ...

  4. 基于Linux的智能家居的设计(5)

    4  软件设计 软件设计部分主要包含uboot移植.内核编译.系统移植.设备驱动编程.应用程序编程(QT编程.mysql数据库编程.控制系统编程).各个模块的功能函数(部分是在windows以下的IA ...

  5. 李洪强iOS下的实际网络连接状态检测

    iOS下的实际网络连接状态检测 序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部 ...

  6. C++获取二维数组的元素个数

    C/C++获取二维数组的大小/长度/元素个数 ][]; ]) /

  7. Extjs中设置只读的样式问题

    废话不多说,直接上代码:   view.down('#imageFile').hide(); view.down('#save_button').hide(); view.show(); view.d ...

  8. Android学习之ItemTouchHelper实现RecylerView的拖拽以及滑动删除功能

    今天在群里见大神们提到控件的拖动以及滑动删除的效果实现,就在网上找了资料ItemTouchHelper学习,并实现其功能.不胜窃喜之至,忍不住跟大家分享一下,如今就对学习过程做下简介.帮助大家实现这样 ...

  9. 升级/安装主题插件提示权限不足 输入FTP解决办法

    在VPS上升级WordPress的时候遇到了权限不足的问题,情况如下: 经过查找发现,是由于升级程序没有权限更改WordPress的目录导致的,解决的方法也很容易,只需要ssh到vps,运行 chow ...

  10. Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。

    You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...