HDU 2859 Phalanx (DP)
来源:互联网 发布:手机键盘软件 编辑:程序博客网 时间:2024/06/12 18:48
Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th anniversary of the PRC.
A phalanx is a matrix of size n*n, each element is a character (a~z or A~Z), standing for the military branch of the servicemen on that position.
For some special requirement it has to find out the size of the max symmetrical sub-array. And with no doubt, the Central Military Committee gave this task to ALPCs.
A symmetrical matrix is such a matrix that it is symmetrical by the “left-down to right-up” line. The element on the corresponding place should be the same. For example, here is a 3*3 symmetrical matrix:
cbx
cpb
zcc
A phalanx is a matrix of size n*n, each element is a character (a~z or A~Z), standing for the military branch of the servicemen on that position.
For some special requirement it has to find out the size of the max symmetrical sub-array. And with no doubt, the Central Military Committee gave this task to ALPCs.
A symmetrical matrix is such a matrix that it is symmetrical by the “left-down to right-up” line. The element on the corresponding place should be the same. For example, here is a 3*3 symmetrical matrix:
cbx
cpb
zcc
3abxcybzca4zabacbababbccacq0
33
状态:dp[i][j]为第i行第j列所能够组成的最大对称子矩阵的长度。关于对角线完全对称的矩阵!
转移方程为:dp[i][j]=dp[i-1][j+1]+1 ; 注意这里是由点(i-1,j+1)推过来的。因为我们在这里矩阵的对角线是由左下角推到右上角去的。
首先我们要进行初始化,第0行的它们所能组成的dp[0][i]=1,最大只能组成1个。
然后我们对每个点进行判断(i,j),当然它是从(i-1,j+1)推过来的。但是对于每个字符看该列以上和该行右侧的字符匹配量,如果该匹配量大于右上角记录下来的矩阵大小,那么就是右上角的数值加1,否则就是这个匹配量(因为我们我们每次都要满足所有的,所以要尽可能的取小的)
参考网址:here
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<vector>using namespace std;#define maxn 1111int dp[maxn][maxn];char arr[maxn][maxn];int main(){ int n; while(~scanf("%d",&n)) { if(n==0) break; int ans=1; for(int i=0; i<n; i++) scanf("%s",arr[i]); for(int i=0; i<n; i++) dp[0][i]=1; for(int i=1; i<n; i++) { for(int j=0; j<n; j++) { int tmpx=i,tmpy=j; while( tmpx>=0 && tmpy<n && arr[tmpx][j]==arr[i][tmpy] ) tmpx--, tmpy++; dp[i][j] = min(dp[i-1][j+1]+1,i-tmpx); ans=max(ans,dp[i][j]); } } printf("%d\n",ans); }}
稍微改动下, 注意边界细节!!!改完之后感觉没有上面代码清爽!!!
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<vector>using namespace std;#define maxn 1111int dp[maxn][maxn];char arr[maxn][maxn];int main(){ int n; while(~scanf("%d",&n)) { if(n==0) break; int ans=1; for(int i=0; i<n; i++) scanf("%s",arr[i]); for(int i=0; i<n; i++) dp[0][i]=1; for(int i=1; i<n; i++) { for(int j=0; j<n; j++) { int tmpx=i,tmpy=j; while( tmpx>=0 && tmpy<n && arr[tmpx][j]==arr[i][tmpy] && dp[i-1][j+1]+1>i-tmpx)/// tmpx--, tmpy++; dp[i][j] = i-tmpx; ///tmpx最后所指向的不符合条件的位置,这样就不用加1了(其实长度应该是i-符合条件的位置) ans=max(ans,dp[i][j]); } } printf("%d\n",ans); }}
0 0
- 【HDU】2859 Phalanx (DP)
- HDU 2859 Phalanx(DP)
- HDU 2859 Phalanx(DP)
- HDU 2859 Phalanx (DP)
- HDU 2859 Phalanx (DP)
- HDU 2859 Phalanx (DP)
- 【DP】 HDU 2859 Phalanx
- hdu-2859 Phalanx 【dp】
- DP-HDU-2859-Phalanx
- hdu(2859)——Phalanx(dp)
- HDU 2859 Phalanx(二维DP)
- HDU 2859 Phalanx(二维dp)
- Q - Phalanx HDU 2859 ( dp )
- HDU 2859 Phalanx 简单DP
- 简单dp,HDU 2859 Phalanx
- HDU 2859 Phalanx(dp吧~ ~ ~)
- HDU 2859 Phalanx——DP
- HDOJ 2859 Phalanx (基础DP)
- jQuery.extend 函数使用详解
- 指针的问题
- 《Cracking the Coding Interview程序员面试金典》----确定两串乱序同构
- Domai adaptation 相关的句子
- react native SectionList 使用详解
- HDU 2859 Phalanx (DP)
- c/c++ No.22 查找子串
- content="IE=edge,chrome=1">含义
- 【DVB】DVB-T系统的参数和搜台介绍
- Java 调用外部程序
- WPF学习之深入浅出话命令
- VM下载与安装,破解
- 进不去的城市,回不了的老家,该何去何从?
- #include< > 和 #include” ” 的区别