区间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;
}
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
weilx12345 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛5 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·5 天前
C++ 萌新语法入门篇
c++·算法比赛
Because_of_Her15 天前
并查集-听课笔记
笔记·算法·并查集