题目描述

农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记。比如说:

  1. ABCD
  2. BXZX
  3. CDXB
  4. WCBA

某一天,FJ从农场的左上角走到右下角,当然啦,每次他只能往右或者往下走一格。FJ把他走过的路径记录下来。现在,请你把他统计一下,所有路径中,回文串的数量(从前往后读和从后往前读一模一样的字符串称为回文串)。

输入输出格式

输入格式:

第一行包括一个整数N,表示农场的大小,接下来输入一个N*N的字母矩阵。

输出格式:

Please output the number of distinct palindromic routes Bessie can take,

modulo 1,000,000,007.

输出一个整数,表示回文串的数量。

输入输出样例

输入样例#1:

  1. 4
  2. ABCD
  3. BXZX
  4. CDXB
  5. WCBA
输出样例#1:

  1. 12
    题解:动态规划
    f[i][j][k]为起点开始竖方向向下走到i,横向走到j,从终点向上走到k,可知l=i+j-k
    f[i][j][k]->f[i+1][j][k]&f[i][j+1][k]&f[i+1][j][k+1]&f[i][j+1][k+1](颜色相同)
    最后答案就是i+j=n时的最大值
    时空间复杂度都是O(n^3)但还有优化
    可以把第一维换成步数,f[i][j][k]表示走i步,向下到i,向上到k
    f[i][j][k]->f[i+1][j+1][k]&f[i+1][j+1][k+1]&f[i+1][j][k+1]&f[i+1][j][k]
    用滚动数组消去一个n
    此题巨坑,时间卡的紧,多谢YZD大佬指点才过
    要点:若f[now][j][k]=0就不转移
  2. 还有一个超级玄学优化,将滚动数组的第一位放到第三维,每次开始前不清空f[][][nxt],改为在i<n时,转移后将
    f[][][now]清空。比原来快1000ms
  1.  
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. using namespace std;
  6. typedef long long lol;
  7. int Mod=;
  8. lol f[][][];
  9. int now,nxt,n,m;
  10. lol ans;
  11. char a[][];
  12. void get(int i)
  13. {
  14. int x=;
  15. char ch=getchar();
  16. while (ch<'A'||ch>'Z') ch=getchar();
  17. while (ch>='A'&&ch<='Z')
  18. {
  19. x++;
  20. a[i][x]=ch;
  21. ch=getchar();
  22. }
  23. }
  24. int main()
  25. {
  26. register int i,j,k;
  27. //freopen("b.in","r",stdin);
  28. //freopen("b.out","w",stdout);
  29. cin>>n;
  30. m=n;
  31. for (i=; i<=n; i++)
  32. {
  33. get(i);
  34. }
  35. if (a[][]!=a[n][m])
  36. {
  37. cout<<<<endl;
  38. return ;
  39. }
  40. f[][n][]=;
  41. now=;
  42. nxt=;
  43. for (i=; i<=n; i++)
  44. {
  45. swap(now,nxt);
  46. for (j=; j<=i; j++)
  47. {int b=n-i+;
  48. for (k=n; k>=b; k--)
  49. if(f[j][k][now])
  50. {
  51. int y1=i-j+,y2=m-i+n-k+;
  52. //printf("%d %d %d %d %d\n",i,j,y1,k,y2);
  53. f[j][k][now]%=Mod;
  54. if (j+<=n&&k->=&&a[j+][y1]==a[k-][y2])
  55. f[j+][k-][nxt]+=f[j][k][now];
  56.  
  57. if (j+<=n&&y2->=&&a[j+][y1]==a[k][y2-])
  58. f[j+][k][nxt]+=f[j][k][now];
  59.  
  60. if (y1+<=m&&k->=&&a[j][y1+]==a[k-][y2])
  61. f[j][k-][nxt]+=f[j][k][now];
  62.  
  63. if (y1+<=m&&y2->=&&a[j][y1+]==a[k][y2-])
  64. f[j][k][nxt]+=f[j][k][now];
  65. if (i<n)
  66. f[j][k][now]=;
  67. }
  68. }
  69. }
  70. for (i=; i<=n; i++)
  71. ans=(ans+f[i][i][now])%Mod;
  72. cout<<ans%Mod;
  73. }
  1.  
  1.  

[USACO15OPEN]回文的路径Palindromic Paths 2.0版的更多相关文章

  1. [USACO15OPEN]回文的路径Palindromic Paths

    [USACO15OPEN]回文的路径Palindromic Paths 题目描述 Farmer John's farm is in the shape of an N \times NN×N grid ...

  2. 题解 P3126 【[USACO15OPEN]回文的路径Palindromic Paths】

    P3126 [USACO15OPEN]回文的路径Palindromic Paths 看到这题题解不多,蒟蒻便想更加通俗易懂地分享一点自己的心得,欢迎大佬批评指正^_^ 像这种棋盘形的两边同时做的dp还 ...

  3. [译+改]最长回文子串(Longest Palindromic Substring) Part II

    [译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...

  4. [译]最长回文子串(Longest Palindromic Substring) Part I

    [译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...

  5. 洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有 ...

  6. 领扣-5 最长回文子串 Longest Palindromic Substring MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. USACO 回文的路径

    传送门 这道题和传纸条在某些方面上非常的相似.不过这道题因为我们要求回文的路径,所以我们可以从中间一条大对角线出发去向两边同时进行DP. 这里就有了些小小的问题.在传纸条中,两个路径一定是同时处在同一 ...

  8. 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2< ...

  9. Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

    Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...

随机推荐

  1. beta冲刺2-咸鱼

    q前言:今天晚上大概把github的的相关东西弄上了.然后把之前做的一些修改什么的也上传上去了.目测之后的话就是在自己这边改完然后直接上github那边去复制粘贴替换掉了. 昨天的问题:github这 ...

  2. 网络1712--c语言第二次作业总结

    1.作业亮点 1.1在调试问题方面有明显进步,变量声明方面有所改变,没有发现大面积抄袭现象. 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--代码格式良好,思路清晰,调试部分图文 ...

  3. 2017C语言程序设计预备作业

    Deadline:2017-9-30 23:00 一.学习使用MarkDown 本学期的博客随笔都将使用MarkDown格式,要求熟练掌握MarkDown语法,学会如何使用标题,插入超链接,列表,插入 ...

  4. Alpha冲刺No.2

    冲刺Day2 一.站立式会议计划 分组讨论研究:较好的掌握MYSQL的使用,以及Android Studio图形化界面设计的学习同步进行. 完成设计数据库架构,进阶版. 登录.注册界面的设计. 能从同 ...

  5. 201621123040《Java程序设计》第十一周学习总结

    1.本周学习总结 1.1以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 2.1源代码阅读:多线程程序BounceThread 2.1.1BallRunnable类有什么用?为什 ...

  6. Something about SeekingJob---Resume简历

    这几天脑子里满满的装的都是offer.offer.offer快到碗里来,但是offer始终不是巧克力,并没那么甜美可口易消化. 找工作刚开始,就遇到了不小的阻力,看到Boss直聘上各种与IT相关的工作 ...

  7. 第5章 子网划分和CIDR

    第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ...

  8. Python内置函数(26)——enumerate

    英文文档: enumerate(iterable, start=0) Return an enumerate object. iterable must be a sequence, an itera ...

  9. SiteMesh入门(1-1)SiteMesh是什么?

    1.问题的提出 在开发Web 应用时,Web页面可能由不同的人参与开发,因此开发出来的界面通常千奇百怪.五花八门,风格难以保持一致. 为了统一界面的风格,Struts 框架提供了一个标签库Tiles ...

  10. Spring-Boot导入配置文件与取值

    前言: springboot简化了大量配置文件,但是必要时还是需要导入配置文件的,比如dubbo,此处简记之. 正文: 所有的配置文件引入都是使用注解在类上进行引入的,常用的有两种注解@Propert ...