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

InputThere are several test cases in the input file. Each case starts with an integer n (0<n<=1000), followed by n lines which has n character. There won’t be any blank spaces between characters or the end of line. The input file is ended with a 0.OutputEach test case output one line, the size of the maximum symmetrical sub- matrix.
Sample Input

3
abx
cyb
zca
4
zaba
cbab
abbc
cacq
0

Sample Output

3
3

题意:给一个n*n的字母矩阵,判断是否以左下至右上为轴对称。
题解:以dp[i][j]=dp[i-1][j+1]+1||dp[i][j]=k(k为该位置上方与右方顺序字符匹配数)为递推方程解决问题,也就是以轴上的元素为基准,从上到下,从左到右得出所有的答案。另外,该dp可以滚动。
不滚:

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include  <cassert>
#include   <cstdio>
#include   <vector>
#include   <string>
#include    <cmath>
#include    <queue>
#include    <stack>
#include      <set>
#include      <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }

const int maxn = 1e3+5;
char m[maxn][maxn];
int dp[maxn][maxn];
int n;

int main(){
	while(scanf("%d", &n)&&n){
		int maxx=0;
		rep(i,1,n)scanf("%s", m[i]+1);
		rep(i,1,n)dp[1][i]=0;
		rep(i,1,n){
			rep(j,1,n){
				int tx=i;
				int ty=j;
				int k=0;
				while(tx>0&&ty<=n&&m[tx][j]==m[i][ty]){
					k++,tx--,ty++;
				}
				if(k>dp[i-1][j+1])dp[i][j]=dp[i-1][j+1]+1;
				else dp[i][j]=k;
				maxx=max(maxx,dp[i][j]);
			}
		}
		printf("%d\n", maxx);
	}
	
}

滚:

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include  <cassert>
#include   <cstdio>
#include   <vector>
#include   <string>
#include    <cmath>
#include    <queue>
#include    <stack>
#include      <set>
#include      <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }

const int maxn = 1e3+5;
char m[maxn][maxn];
int dp[maxn];
int n;

int main(){
	while(scanf("%d", &n)&&n){
		int maxx=0;
		rep(i,1,n)scanf("%s", m[i]+1);
		rep(i,1,n)dp[i]=0;
		rep(i,1,n){
			rep(j,1,n){
				int tx=i;
				int ty=j;
				int k=0;
				while(tx>0&&ty<=n&&m[tx][j]==m[i][ty]){
					k++,tx--,ty++;
				}
				if(k>dp[j+1])dp[j]=dp[j+1]+1;
				else dp[j]=k;
				maxx=max(maxx,dp[j]);
			}
		}
		printf("%d\n", maxx);
	}
	
}

发表评论

邮箱地址不会被公开。 必填项已用*标注