最长回文子串(DP版本)-O(n^2)

文章介绍了如何利用动态规划方法来判断一个给定字符串的子串是否为回文串,并给出了相关代码实现。通过填充二维dp数组来判断区间[i,j]是否为回文串,优化过程中找到了最长回文子串的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://oj.daimayuan.top/course/5/problem/137

ps:虽然这题用manacher/KMP/EXKMP都可以做,且还能优化..但是还是可以讲一下DP版本的..

我们定义DP[i][j]:区间[i,j]是一个回文串。即长度:j-i+1

代码:

#include <bits/stdc++.h>
const int N=2e6+10;
using namespace std;
int a[N];
bool dp[1001][1001];

inline void solve(){
	int n,mx=-1;cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int j=1;j<=n;j++){
		for(int i=1;i<=j;i++){
			if(j-i<=1) dp[i][j]=(a[i]==a[j]);
			else dp[i][j]=(a[i]==a[j]&&dp[i+1][j-1]);
			if(dp[i][j]&&mx<j-i+1){
				mx=j-i+1;
			}
		}
	}
	cout<<mx;
}

signed main(){
	solve();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值