字符串、区间DP之 删除字符串、最长回文串、乘积最大(详细分析)

本文详细探讨了三种字符串处理问题:1)删除字符串,利用区间DP求解最小删除次数;2)寻找最长回文串,通过动态规划求解;3)最大化数字串乘积,分析不同分法的影响。每部分包含题目描述、算法分析和代码实现。

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

①删除字符串

题目描述

题目描述
给出一个长度为n的字符串,每次可以删除一个字母相同的子串,问最少需要删多少次。 数据规模:n <= 500

输入格式
第1行:1个整数,表示字符串的长度
第2行:n个字符的字符串

输出格式
第1行:1个整数,表示答案

样例

样例输入
5
abaca
样例输出
3

算法分析

此题即为典型的区间DP题,根据题目可以设以 dp[l,r]是为 l 到 r区间删除完字符串的最小次数,可分两种情况讨论:

一般情况下,dp[l,r]由长度可以通过 dp[l+1,r]或 dp[l,r−1]增加一个字符得到,此时取两者之间的最小值。
枚举 k∈(l,r),用 k作为决策点,如果 c[l]=c[k]即可以通过 dp[l][k−1]+dp[k][r]直接得到, 注意此处不需要加一, 因为c[l]和 c[k]是相同字符,所以可以直接删除,而在计算c[l] 和 c[k]时,已经加一所以,不需要加一!

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1005;
char s[M];
int f[M][M];
int main(){
   
	int n;
	scanf("%d",&n);
	scanf("%s",&s[1]);
	for(int i=1;i<=n;i++){
   
		f[i][i]=1;
	}
	for(int len=1;len<=n;len++){
   
		for(int l=1;l<=n-len;l++){
   
			int r=len+l;
			if(s[l]==s[r]){
   
				f[l][r]=f[l+1][r-1
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值