HDOJ 2859 Phalanx (基础DP)
来源:互联网 发布:ods有什么软件 编辑:程序博客网 时间:2024/05/17 06:02
题意:
给出一个 n*n 矩阵,求出最大长度的矩阵使矩阵内部关于反对角线对称。
比如:
3
abx
cyb
zca
答案就是 3,以斜对角线对称。
思路:
一看就是一个DP,那么考虑状态,如何标记一举行,(i,j,len),表示起点在 i ,j,长度为len 的矩形,对于一个矩形来说,可以由两个长度小 1 的子矩形合成来,
令dp[i][j][len]为起点在 i ,j,长度为len 的矩形满足要求的最大边长, 注意这个值要么为 len,要么为0;
那么稍微画一画图就可以得到:
如果满足:dp[i][j+1][len-1]==len-1&&dp[i+1][j][len-1]==len-1且mp[l][r]==mp[i][j]
也就是说两个子矩形是对称矩形,且两个端点也是对称的。
那么(i,j,len)这个矩形也是对称的。
那么就有一个n^3的解法:先枚举矩形长度,再枚举起点,这里要注意一定要先枚举长度,因为从DP方程来看是由小矩形推到大矩形的。
n 是1000,那么就是 1e9 的复杂度,但是这个题给了 5000MS,那么不要怂,莽一波。
但是这里还有哟一个问题:
dp[i][j][len],i,j,len,都是1000,那么就爆内存了,我们继续看DP方程,只用到了两个子答案就是dp[i][j+1][len-1]和dp[i+1][j][len-1],也就是说对于当前len来说,只会用到len-1,而前面的len-2等等都不会用到,那么就用滚动数组优化一下就变成了: dp[1000][1000][2],那么内存问题就解决了。
最后附上毒代码:
#include<stdio.h>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<vector>#include<stack>#include<math.h>#include<map>#include<iostream>using namespace std;#define maxn 1050#define ll long longchar mp[maxn][maxn];int n,dp[maxn][maxn][2];int main(){ while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); if(n==0) break; for(int i=1;i<=n;i++) scanf("%s",mp[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j][0]=1; int ans=1; int now=1,tmp=0; for(int len=2;len<=n;len++) { for(int i=1;i<=n;i++) { if(i+len-1>n) break; for(int j=1;j<=n;j++) { if(j+len-1>n) break; int l=i+len-1; int r=j+len-1; if(mp[l][r]==mp[i][j]) { if(dp[i][j+1][tmp]==len-1&&dp[i+1][j][tmp]==len-1) dp[i][j][now]=len; else dp[i][j][now]=0; } else dp[i][j][now]=0; ans=max(ans,dp[i][j][now]); } } if(now==1) now=0,tmp=1; else now=1,tmp=0; } printf("%d\n",ans); }return 0;}
0 0
- HDOJ 2859 Phalanx (基础DP)
- 【HDU】2859 Phalanx (DP)
- HDU 2859 Phalanx(DP)
- HDU 2859 Phalanx(DP)
- HDU 2859 Phalanx (DP)
- HDU 2859 Phalanx (DP)
- HDU 2859 Phalanx (DP)
- HDOJ 2859 Phalanx
- hdu(2859)——Phalanx(dp)
- HDU 2859 Phalanx(二维DP)
- HDU 2859 Phalanx(二维dp)
- 【DP】 HDU 2859 Phalanx
- hdu-2859 Phalanx 【dp】
- DP-HDU-2859-Phalanx
- HDU2859 Phalanx (DP)
- Q - Phalanx HDU 2859 ( dp )
- HDU 2859 Phalanx 简单DP
- 简单dp,HDU 2859 Phalanx
- MYSQL的创建新用户数据库的步骤实例
- VR实现空间定位的7种利器(下)
- 简单工厂模式
- 性能测试
- MATLAB环境下用SVM对数据进行2-折分类
- HDOJ 2859 Phalanx (基础DP)
- c++实验4-百钱百鸡问题
- mysql 数据库分区操作
- HDOJ--2024 C语言合法标识符
- js判断数组是否有重复值
- SSL与TLS的区别以及介绍
- Regular Expression Matching
- angular2学习笔记(11)
- 变量,常量,数据类型