*HDU2859.Phalanx(最大对称子矩阵dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859
题意:找出矩阵中最大的以右对角线为轴对称的子矩阵
解题思路:dp[i][j]表示以i和j为左下角向上方和右方延伸的最长相同长度
dp[i][j]由dp[i-1][j+1]决定,最大也只能比dp[i-1][j+1]大一,因为(i-1,j+1)为(i,j)的右上角,以他们为对角线组成子矩阵。如果dp[i-1][j+1]为1(即它自身),那么dp[i-1][j+1]要想找对称子矩阵也只能是1或者2。
所以dp主体为:

for(int i=0;i<n;i++){
			for(int j=n-1;j>=0;j--){   //右上到左下
				dp[i][j]=1;
				if(i==0||j==n-1)
					continue;
				int t=dp[i-1][j+1];   //以右上方为标准  如果是对称子矩阵,一定是从右上角依次递增(1 2 3 4 5...),最大也只能是dp[i-1][j+1]+1
				for(int k=1;k<=t;k++){
					if(s[i-k][j]==s[i][j+k])
						dp[i][j]++;
					else
						break;
				}
				ans=max(ans,dp[i][j]);
			}
		}
#include<iostream>
#include<cstdio>
using namespace std;
int n;
char s[1100][1100];
int dp[1100][1100];
int ans;
int max(int a,int b){
	return a<b? b:a;
}
int main(){
	while(cin>>n){
		if(n==0)  break;
		ans=1;
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++)
			scanf("%s",s[i]);
		for(int i=0;i<n;i++){
			for(int j=n-1;j>=0;j--){   //右上到左下
				dp[i][j]=1;
				if(i==0||j==n-1)
					continue;
				int t=dp[i-1][j+1];   //以右上方为标准  如果是对称子矩阵,一定是从右上角依次递增(1 2 3 4 5...)
				for(int k=1;k<=t;k++){
					if(s[i-k][j]==s[i][j+k])
						dp[i][j]++;
					else
						break;
				}
				ans=max(ans,dp[i][j]);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/littlegoldgold/article/details/107239994
今日推荐