UVa 11584 Partitioning by Palindromes

本文介绍了一种将字符串分割成最少数量回文子串的方法。通过动态规划算法,利用n^2时间预处理所有可能的回文子串,并确定最小分割数。

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

题目:Partitioning by Palindromes

 

题意:

来自luogu——

当一个字符串正序和反序是完全相同时,我们称之为“回文串”。例如“racecar”就是一个回文串,而“fastcar”就不是。现在给一个字符串s,把它分割成若干个互不相交的回文子串,求分割的回文子串的最少个数。

 

思路:

先用n^2的时间判断出所有子串。

令f[i]表示前i个字符分割的回文子串的最少个数,转移方程:f[i]=min(f[i],f[j-1]+1),其中[i,j]为一个回文串。

 

代码:

#include<bits/stdc++.h>
using namespace std;

#define maxn 1000

int n;
char str[maxn+5];
bool isp[maxn+5][maxn+5];
int f[maxn+5];

void readin() {
	scanf("%s",str);
	n=strlen(str);
}

void init(){
	memset(isp,0,sizeof(isp));
	for(int i=0;i<n;i++) {
		isp[i+1][i+1]=true;
		if(str[i]==str[i+1]) isp[i+1][i+2]=true;
	}
	for(int i=n-1;i>=0;i--){
		for(int j=i+2;j<n;j++){
			if(str[i]==str[j]&&isp[i+2][j]) isp[i+1][j+1]=true;
		}
	}
	for(int i=1;i<=n;i++) f[i]=i;
}

int dp(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			if(isp[j][i]) f[i]=min(f[i],f[j-1]+1);
		}
	}
	return f[n];
}

int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		readin();
		init();
		int ans=dp();
		printf("%d\n",ans);
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值