hdu 4618 Palindrome Sub-Array

来源:互联网 发布:mac软件助手哪个好用 编辑:程序博客网 时间:2024/06/06 03:27

数据弱 dp 暴力都能过

dp:

d(i,j,k)表示左上角坐标为(i,j),k为正方形边长

初始化 d(i,j,0)=1   d(i,j,1)=1

如果d(i+1,j+1,k-2)=1,且上下两个外围的相等且回文,左右两个外围的相等且回文;d(i,j,k)=1,否则d(i,j,k)=0

#include <stdio.h>#include <string.h>int a[310][310];bool d[310][310][310];int check(int x,int y,int l){    for(int i=y;i<=y+l-1;i++)    if(a[x][i]!=a[x+l-1][i])return 0;     for(int i=x;i<=x+l-1;i++)    if(a[i][y]!=a[i][y+l-1])return 0;    for(int i=x;i<=x+l/2;i++)    if(a[i][y]!=a[x+l-1-(i-x)][y])return 0;    for(int i=y;i<=y+l/2;i++)    if(a[x][i]!=a[x][y+l-1-(i-y)])return 0;    return 1;}int main(){    int T;    int n,m;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        memset(d,0,sizeof(d));        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                scanf("%d",&a[i][j]);                d[i][j][0]=1;                d[i][j][1]=1;            }        }        int l=n<m?n:m;        int ans=1;        for(int k=2;k<=l;k++)        {            for(int i=1;i<=n;i++)            {                if(i+k-1>n)break;                for(int j=1;j<=m;j++)                {                    if(j+k-1>m)break;                    if(d[i+1][j+1][k-2]&&check(i,j,k))                    {                        d[i][j][k]=1;                        if(k>ans)ans=k;                    }                }            }        }        printf("%d\n",ans);    }    return 0;}



暴力


#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <algorithm>#include <vector>#include <queue>#include <map>using namespace std;int s[305][305];int n,m;int l;int ans;void init(){    scanf("%d%d",&n,&m);    for(int i=0; i<n; i++)    {        for(int j=0; j<m; j++)        {            scanf("%d",&s[i][j]);        }    }}void solve(){    ans = 1;    for(int i=0; i<n; i++)    {        for(int j=0; j<m; j++)        {            if(min(n-i,m-j) <= ans)            {                break;            }            l = min(n-i,m-j);            while(l > ans)            {                if(s[i][j]==s[i+l-1][j]&&s[i+l-1][j]==s[i][j+l-1]&&s[i][j+l-1]==s[i+l-1][j+l-1])                {                    int q = 0;                    for(int k = 1; k * 2 < l; k++)                    {                        if(s[i+k][j]==s[i+l-1-k][j]&&s[i+l-1-k][j]==s[i+k][j+l-1]&&s[i+k][j+l-1]==s[i+l-1-k][j+l-1])                        {                            if(s[i][j+k]==s[i+l-1][j+k]&&s[i+l-1][j+k]==s[i][j+l-1-k]&&s[i][j+l-1-k]==s[i+l-1][j+l-1-k])                            {                                if(s[i+k][j+k]==s[i+l-1-k][j+k]&&s[i+l-1-k][j+k]==s[i+k][j+l-1-k]&&s[i+k][j+l-1-k]==s[i+l-1-k][j+l-1-k])continue;                                else                                {                                    q = 1;                                    break;                                }                            }                            else                            {                                q = 1;                                break;                            }                        }                        else                        {                            q = 1;                            break;                        }                        for(int c = k - 1; c > 0; c--)                        {                            if(s[i+k][j+c]==s[i+l-1-k][j+c]&&s[i+l-1-k][j+c]==s[i+k][j+l-1-c]&&s[i+k][j+l-1-c]==s[i+l-1-k][j+l-1-c])                            {                                if(s[i+c][j+k]==s[i+l-1-c][j+k]&&s[i+l-1-c][j+k]==s[i+c][j+l-1-k]&&s[i+c][j+l-1-k]==s[i+l-1-c][j+l-1-k])                                {                                    continue;                                }                                else                                {                                    q = 1;                                    break;                                }                            }                            else                            {                                q = 1;                                break;                            }                        }                        if(q == 1)break;                    }                    if(q == 0)ans = l;                }                l--;            }        }    }    printf("%d\n",ans);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        init();        solve();    }    return 0;}


原创粉丝点击