• USACO 2015 US OPEN Gold T2: Palindromic Paths


    题目大意

    农夫FJ的农场是一个N*N的正方形矩阵(1N500),每一块用一个字母作标记。比如说:

              ABCD

              BXZX

              CDXB

              WCBA

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

    题目分析

    因为每次只能横纵走一格,所以无论怎么走,必然会经过从左下到右上的对角线上的某个元素。而题目让我们求的是回文串,所以可以考虑Meet In The Middle。

    从左上和右下开始走,设DP[i][j][k]表示 走了i步 ,左上的点纵坐标为j,右下的点纵坐标为k。

    不难得出转移方程为  当 a[j][i+2-j] == a[k][n*2-i-k] (初始坐标为1,1 ,所以要+2)时 f[i][j][k] = f[i-1][j][k] + f[i-1][j-1][k] +f[i-1][j][k+1] + f[i-1][j-1][k+1],否则 f[i][j][k] = 0。

    因为n=500 而 500^3=1,2500,0000 爆空间,所以我们把第一维 i 压掉, 因为每次转移只会用到 j , j-1 , k , k+1,逆序枚举j、正序枚举k即可避免覆盖还未转移的状态。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long ll;
     5 const ll Mod=1e9+7;
     6 const int MAXN=505;
     7 
     8 int n;
     9 char a[MAXN][MAXN];
    10 ll f[MAXN][MAXN],ans;
    11 int main(){
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;++i)
    14         for(int j=1;j<=n;++j)
    15             cin>>a[i][j];
    16     if(a[1][1]!=a[n][n]){
    17         printf("0
    ");
    18         return 0;
    19     }
    20     f[1][n]=1;
    21     for(int i=1;i<=n-1;++i)
    22         for(int j=i+1;j>=1;--j)
    23             for(int k=n-i;k<=n;++k){
    24                 if(a[j][i+2-j]==a[k][n*2-i-k])
    25                     f[j][k]=(f[j][k]+f[j-1][k]+f[j][k+1]+f[j-1][k+1])%Mod;
    26                 else
    27                     f[j][k]=0;
    28             }
    29     for(int i=1;i<=n;++i)
    30         ans=(ans+f[i][i])%Mod;
    31     printf("%lld
    ",ans);
    32     return 0;
    33 }
  • 相关阅读:
    中间件简单
    typeof + instanceof+toString+constructor什么推理javascript数据类型
    向西项目管理工具Maven一片
    cocos2d-x3.x 设计与实现弹出对话框
    一个IIS网站的异常配置的安全解决方案
    零基Github Page个人博客建立教程无限的自由流动
    分析RAC下一个SPFILE整合的三篇文章的文件更改
    HTML5使用和实战分析HTML5 WebSocket API
    调用系统相机和图库,裁剪图片
    本地图片选择(打开媒体库,选择图片)
  • 原文地址:https://www.cnblogs.com/LI-dox/p/11214249.html
Copyright © 2020-2023  润新知