区间dp-基础题目3(永别)

题目链接

1 解题思路

这道题我们可以把整个字符串的大区间拆分成小区间,然后让相邻的两个小区间拼起来,如果左边小区间的第一个字符和右边小区的的最后一个字符相同,就可以选择它俩,再加上他们之间的字符能构成回文串的最大长度;如果不同,就选左边小区间和右边小区间的较大者。

这就不难想到区间dp: d p l r dplr dplr表示区间 l , r l,r l,r的字符串构成的最长回文串的长度。初始化全部元素为0, d p i i = 1 dpii=1 dpii=1。三种循环,第一层枚举区间长度,第二层枚举左右区间端点,第三层枚举区间的切割点(大区间切割成两个小区间,按照前面的策略更新 d p dp dp值)。

2 AC Code

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,dp[1005][1005];
string s;
int main(){
	cin>>n;
	cin>>s;
	for(int i=1;i<=n;i++) dp[i][i]=1;
	for(int lenn=2;lenn<=n;lenn++){
		for(int l=1,r=l+lenn-1;r<=n;l++,r++){
			if(s[l-1]==s[r-1]){
				if(r-l<=1) dp[l][r]=2;
				else dp[l][r]=max(dp[l][r],2+dp[l+1][r-1]);
			}
			for(int k=l;k<r;k++)
				dp[l][r]=max(dp[l][r],max(dp[l][k],dp[k+1][r]));
		}
	}
	cout<<dp[1][n];
	return 0;
}
相关推荐
文心快码BaiduComate10 分钟前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran25 分钟前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
会周易的程序员32 分钟前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器
UIU11438 分钟前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
闻缺陷则喜何志丹38 分钟前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年1 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨1 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
bnmoel1 小时前
C++ 基础入门篇(一):命名空间,输入&输出,缺省参数,函数重载
c++·函数重载·语法·命名空间·缺省参数
青山木1 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
玛卡巴卡ldf1 小时前
【AICoding】笔试提示词设计思路
java·算法·ai编程