HDU 4618 Palindrome Sub-Array

来源:互联网 发布:上海聚到网络是培训吗 编辑:程序博客网 时间:2024/06/06 03:50

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4618

在n*m的矩阵中寻找一个L*L的子矩阵,使L最大,并且矩阵横竖都是回文的。

暴力出奇迹.

#include<stdio.h>#include<string.h>#include<map>#include<math.h>#include<algorithm>using namespace std;#define rep(i,s,t) for(int i=s;i<t;i++)int t,n,m;int s[301][301];inline bool ok(int x1,int y1,int x2,int y2){rep(i,x1,x2+1){int x=y1,y=y2;while(x<=y){if(s[i][x]!=s[i][y]) return 0;x++,y--;}}rep(i,y1,y2+1){int x=x1,y=x2;while(x<=y){if(s[x][i]!=s[y][i]) return 0;x++,y--;}}return 1;}inline bool dfs(int ans){rep(i,0,n) rep(j,0,m){int x=(i+ans-1),y=(j+ans-1);if(x>=0 && x<n && y>=0 && y<m){if(ok(i,j,x,y)) return 1;}}return 0;}int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);rep(i,0,n) rep(j,0,m) scanf("%d",&s[i][j]);int ans=min(n,m);while(ans>1 && !dfs(ans)) ans--;printf("%d\n",ans);}return 0;}


0 0