题目链接:点击查看

题目大意:给定一个整数n,然后给出一个n*n的方阵,求方阵中最大的对称子方阵(对称指的是以右上角至左下角为对角线)

分析:这个题网上有个一般做法,相当于一个动态规划的小模拟,时间复杂度为,这里不再赘述,一会直接上代码。

然后还有一个方法,是那天讲题的时候,鑫爷以非同常人的脑回路提出的,可以先用打一个哈希表,然后再遍历每一个点进行

判断,如果判断相等则直接更新,如果不相等则可以二分查找最长的相等子序列,这样时间复杂度就下降到了logn了,提交的

时候比一般方法快了十倍还多,不得感叹真的tql。

直接上代码吧:

一般做法:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;char maze[N][N];int dp[N][N];int main()
{
//  freopen("input.txt","r",stdin);int n;while(scanf("%d",&n)!=EOF&&n){for(int i=0;i<n;i++)scanf("%s",maze+i);fill(dp[0],dp[0]+N*N,1);int ans=1;for(int i=1;i<n;i++)for(int j=0;j<n;j++){int x=i;int y=j;while(maze[x][j]==maze[i][y]){x--;y++;if(x<0||y>=n)break;}x=i-x;//所记录的最长相等子序列的长度if(x>dp[i-1][j+1]){dp[i][j]=dp[i-1][j+1]+1;}elsedp[i][j]=x;ans=max(dp[i][j],ans);}cout<<ans<<endl;}return 0;
} 

哈希表+二分:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;typedef unsigned long long ULL;const int inf=0x3f3f3f3f;const int N=1e3+100;ULL p[N],hash_1[N][N],hash_2[N][N];char maze[N][N];int dp[N][N];void hash_(int n)
{for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){hash_1[i][j]=hash_1[i][j-1]*131+(maze[i][j]-'a'+1);}for(int j=1;j<=n;j++)for(int i=n;i>=1;i--){hash_2[i][j]=hash_2[i+1][j]*131+(maze[i][j]-'a'+1);}
}void initp()
{p[0]=1;for(int i=1;i<N;i++)p[i]=p[i-1]*131;
}void init(int n)
{memset(maze,0,sizeof(maze));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dp[i][j]=1;memset(hash_1,0,sizeof(hash_1));memset(hash_2,0,sizeof(hash_2));
}int main()
{
//  freopen("input.txt","r",stdin);int n;initp();while(scanf("%d",&n)!=EOF&&n){init(n);for(int i=1;i<=n;i++)scanf("%s",maze[i]+1);hash_(n);int mmax=1;for(int i=2;i<=n;i++)for(int j=n-1;j>=1;j--){int k=dp[i-1][j+1];ULL a=hash_1[i][j+k]-hash_1[i][j-1]*p[k+1];ULL b=hash_2[i-k][j]-hash_2[i+1][j]*p[k+1];if(a==b)dp[i][j]=k+1;else{int l=1,r=k;int ans=0;while(l<=r){int mid=(l+r)/2;ULL a=hash_1[i][j+mid]-hash_1[i][j-1]*p[mid+1];ULL b=hash_2[i-mid][j]-hash_2[i+1][j]*p[mid+1];if(a==b){ans=mid;l=mid+1;}else{r=mid-1;}   }dp[i][j]=ans+1;}mmax=max(mmax,dp[i][j]);}cout<<mmax<<endl;}return 0;
}

HDU - 2859 Phalanx(动态规划/哈希表)相关推荐

  1. HDU 2859 Phalanx

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2859 解题思路: 对于每个字符看该列以上和该行右侧的字符匹配量,如果匹配量大于右上角记录下来的矩阵大小, ...

  2. HDU 2859 Phalanx (dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元 ...

  3. HDU 2859 Phalanx(二维DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 题目大意:对称矩阵是这样的矩阵,它由"左下到右"线对称. 相应位置的元素应该 ...

  4. HDU - 2859 Phalanx (DP)

    题目: Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th ...

  5. HDU 2859 Phalanx(DP)

    基础DP #include<iostream> #include<algorithm> #include<cstring> #include<string&g ...

  6. 动态规划训练24 [Phalanx HDU - 2859 ]

    Phalanx HDU - 2859 这是一道非常好的题目,我实在是没想到该怎么做,看了一下大神的题解才恍然大悟(还有这种操作?) 由于对称矩阵是以对称轴进行对称的(废话),所以我们可以用dp[i][ ...

  7. 【LeetCode笔记】139. 单词拆分(Java、动态规划、字符串、哈希表)

    文章目录 题目描述 思路 & 代码 二刷更新 题目描述 漏网之题..一个月前写的居然没写博客 思路 & 代码 HashSet 存储 word,便于查询 动态规划三要素在注释中 思路:如 ...

  8. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  9. 【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)

    文章目录 题目描述 思路 & 代码 变式题:返回答案数组 更新 可恶..居然碰到了周一面试没撕出最优复杂度的题 题目描述 难点在于时间复杂度O(n),否则来个sort()还是很轻松的 思路 & ...

最新文章

  1. synchronized原理_Synchronized 实现原理
  2. GitLab添加SSH Keys并连接(windows)
  3. Session的配置
  4. uva 10608 FRIENDS
  5. mysql utf8 bin设置_[mysql]修改collation为utf8_bin
  6. 马上有钱:揭密25种成为有钱人的方法(图)
  7. dede定义全局变量(include/common.inc.php)及调用方式
  8. 函数返回值是否使用引用类型的问题:理解引用、返回值
  9. python cursor函数_执行从python返回cursor的db2plsql函数
  10. 命令行下运行JAVA出错:错误的签名:
  11. 深入浅出Hadoop: 高效处理大数据
  12. 产学研2.0:麦可思大学生就业据、企业创新调查年鉴(含产学研部分)、RD相关数据等
  13. LCD/OLED点阵字模提取软件(汇总)
  14. 单模光纤最大传输距离为多少_单模光纤传输距离是多少?
  15. Visio 2013画直线问题总结(折线变直,交叉时产生的交叉桥)
  16. 深度至尊 GHOST XP SP3 纯净版 V4.0
  17. css英文文本不换行,CSS样式表让英文文本自动换行
  18. Filament渲染引擎剖析 之 通过图元构建几何体
  19. 设备通过国标GB28181/海康Ehome接入EasyCVR,视频无法打开的原因分析及解决方法
  20. 调节广告速度,跳过广告的另一境界——Video Speed Controller

热门文章

  1. addConditionWaiter
  2. 类加载器的概述和分类
  3. 分布式文件系统研究-fastDFS安装及配置文件说明
  4. React是什么及特点
  5. 字符串的转换相关方法
  6. Session的底层实现原理
  7. php paypal订单号查询,php – 在交易后从PayPal获取信息
  8. android flux 与mvp,使用 MVP 时在设计上的考量
  9. python中的set和dict_Python中dict和set的用法讲解
  10. PyTorch深度学习实践06