HDU - 2859 Phalanx(动态规划/哈希表)
题目链接:点击查看
题目大意:给定一个整数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(动态规划/哈希表)相关推荐
- HDU 2859 Phalanx
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2859 解题思路: 对于每个字符看该列以上和该行右侧的字符匹配量,如果匹配量大于右上角记录下来的矩阵大小, ...
- HDU 2859 Phalanx (dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元 ...
- HDU 2859 Phalanx(二维DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 题目大意:对称矩阵是这样的矩阵,它由"左下到右"线对称. 相应位置的元素应该 ...
- HDU - 2859 Phalanx (DP)
题目: Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th ...
- HDU 2859 Phalanx(DP)
基础DP #include<iostream> #include<algorithm> #include<cstring> #include<string&g ...
- 动态规划训练24 [Phalanx HDU - 2859 ]
Phalanx HDU - 2859 这是一道非常好的题目,我实在是没想到该怎么做,看了一下大神的题解才恍然大悟(还有这种操作?) 由于对称矩阵是以对称轴进行对称的(废话),所以我们可以用dp[i][ ...
- 【LeetCode笔记】139. 单词拆分(Java、动态规划、字符串、哈希表)
文章目录 题目描述 思路 & 代码 二刷更新 题目描述 漏网之题..一个月前写的居然没写博客 思路 & 代码 HashSet 存储 word,便于查询 动态规划三要素在注释中 思路:如 ...
- DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...
- 【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)
文章目录 题目描述 思路 & 代码 变式题:返回答案数组 更新 可恶..居然碰到了周一面试没撕出最优复杂度的题 题目描述 难点在于时间复杂度O(n),否则来个sort()还是很轻松的 思路 & ...
最新文章
- synchronized原理_Synchronized 实现原理
- GitLab添加SSH Keys并连接(windows)
- Session的配置
- uva 10608 FRIENDS
- mysql utf8 bin设置_[mysql]修改collation为utf8_bin
- 马上有钱:揭密25种成为有钱人的方法(图)
- dede定义全局变量(include/common.inc.php)及调用方式
- 函数返回值是否使用引用类型的问题:理解引用、返回值
- python cursor函数_执行从python返回cursor的db2plsql函数
- 命令行下运行JAVA出错:错误的签名:
- 深入浅出Hadoop: 高效处理大数据
- 产学研2.0:麦可思大学生就业据、企业创新调查年鉴(含产学研部分)、RD相关数据等
- LCD/OLED点阵字模提取软件(汇总)
- 单模光纤最大传输距离为多少_单模光纤传输距离是多少?
- Visio 2013画直线问题总结(折线变直,交叉时产生的交叉桥)
- 深度至尊 GHOST XP SP3 纯净版 V4.0
- css英文文本不换行,CSS样式表让英文文本自动换行
- Filament渲染引擎剖析 之 通过图元构建几何体
- 设备通过国标GB28181/海康Ehome接入EasyCVR,视频无法打开的原因分析及解决方法
- 调节广告速度,跳过广告的另一境界——Video Speed Controller