区间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;
}
相关推荐
fqbqrr7 小时前
2607C++,使用微软detours勾挂工具
c++
爱刷碗的苏泓舒8 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
蓝悦无人机10 小时前
C++基础 — 函数总结
开发语言·c++
烬羽10 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米11 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠11 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
我不是懒洋洋12 小时前
从零实现一个分布式监控:Prometheus的核心设计
c++
An_s12 小时前
c++对接pdfium(一)win系统篇
开发语言·c++
众少成多积小致巨12 小时前
C++ 规范参考(上)
c++
QXWZ_IA13 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务