区间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;
}
相关推荐
橘和柠3 分钟前
知识图谱实战(一):数据采集与实体关系抽取(完整代码)
算法
郝学胜_神的一滴4 分钟前
C++20 高级编程 001:从极简HelloWorld到现代类型体系全梳理
c++·后端
Mem0rin15 分钟前
前缀和:中心下标与数组乘积
数据结构·算法
Lazionr15 分钟前
list容器详解——双向链表的封装与使用
数据结构·c++·链表·list
windliang16 分钟前
Claude Code 源码分析(八):Memory 如何被写入、整理与按需召回
前端·算法·面试
Nil20816 分钟前
C++ emplace_back 与 push_back 详解
开发语言·c++
漂流瓶jz20 分钟前
UVA-12174 Shuffle的播放记录 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·图论·滑动窗口·算法竞赛入门经典·uva
Forever Nore22 分钟前
LeetCode 6 Z 字形变换 - 按行模拟
算法·leetcode
Darkwanderor33 分钟前
线程概念和Linux线程
linux·c语言·c++
lingran__42 分钟前
C++ 高阶数据结构:红黑树万字详解|完整原理推导 + 插入实现 + 完整性校验【STL 底层】
数据结构·c++·面试·红黑树·二叉搜索树·平衡二叉树·stl底层