dp训练计划——最大对称子矩阵hdu2859

题目链接:https://vjudge.net/problem/HDU-2859

题意:

给你一个n*n的字母矩阵,求最大对称子矩阵的长度。

题解:

经典的dp问题。

状态:dp[i][j]表示从(i,j)开始到右上角某一点能形成的最大对称子矩阵长度。

状态转移:

dp[i][j]=1+\sum_{k=1}^{dp[i-1][j+1]}[s[i-k][j]==s[i][j+k]]

注意枚举顺序,因为是考虑的右上角,我们可以考虑正着枚举i,倒着枚举j。

这样保证了无后效性。

代码实现:

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<unordered_map>
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
char s[1005][1005];
int dp[1005][1005];
int n;
int main(){
    while(~scanf("%d",&n)&&n){
        mst(dp,0);
        rp(i,0,n-1) scanf("%s",s[i]);
        rp(i,0,n-1){
            RP(j,n-1,0){
                dp[i][j]=1;
                if(i==0||j==n-1) continue;
                int t=dp[i-1][j+1];
                rp(k,1,t){
                    if(s[i-k][j]==s[i][k+j]) dp[i][j]++;
                    else break;
                }
            }
        } 
        int ans=0;
        rp(i,0,n-1) ans=max(ans,*max_element(dp[i],dp[i]+n));
        printf("%d\n",ans);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值