热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

51Nod1154回文串划分(最少回文串dp)

回文串划分有一个字符串S,求S最少可以被划分为多少个回文串。例如:abbaabaa,有多种划分方式。a|bb|aabaa-3个回文串a|b

回文串划分

 

有一个字符串S,求S最少可以被划分为多少个回文串。
例如:abbaabaa,有多种划分方式。
a|bb|aabaa - 3 个回文串
a|bb|a|aba|a - 5 个回文串
a|b|b|a|a|b|a|a - 8 个回文串
其中第1种划分方式的划分数量最少。

Input输入字符串S(S的长度<&#61; 5000)。Output输出最少的划分数量。Sample Input

abbaabaa

Sample Output

3


字符串dp。O(n^2)枚举中心点&#xff0c;向两边找相同字符&#xff0c;状态转移方程&#xff1a;dp[k]&#61;min(dp[k],dp[j-1]&#43;1)。

#include
#include

#include

#include
<string.h>
#include

#include
<string>
#include

#include

#include

#include
<set>
#include

#define MAX 5005
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef
long long ll;int dp[MAX];int main()
{
int t,n,m,i,j,k;char s[MAX];scanf(" %s",s&#43;1);int len&#61;strlen(s&#43;1);memset(dp,INF,sizeof(dp));dp[0]&#61;0;for(i&#61;1;i<&#61;len;i&#43;&#43;){for(j&#61;i,k&#61;i;0){if(s[j]&#61;&#61;s[k]){dp[k]&#61;min(dp[k],dp[j-1]&#43;1);}else break;}for(j&#61;i,k&#61;i&#43;1;0){if(s[j]&#61;&#61;s[k]){dp[k]&#61;min(dp[k],dp[j-1]&#43;1);}else break;}}printf("%d\n",dp[len]);return 0;
}

 

转:https://www.cnblogs.com/yzm10/p/8878549.html



推荐阅读
author-avatar
施华洛卉子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有