UVA-11584 Partitioning by Palindromes 动态规划 回文串的最少个数

Posted 糖栗子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA-11584 Partitioning by Palindromes 动态规划 回文串的最少个数相关的知识,希望对你有一定的参考价值。

题目链接:https://cn.vjudge.net/problem/UVA-11584

题意

给一个字符串序列,问回文串的最少个数。
例:aaadbccb
分为aaa, d, bccb三份
n<=1000

思路

这道题还是简单的,首先可以设想dp(i)为前i个字符中最少个数。
那么转移方程随之而来,dp(i)=min( dp(j-1)+1 | [j, i]是回文串 )。
这里分析复杂度是O(n^3),但是咱可以预处理[j, i]是不是回文串,复杂度降到O(n^2)。

提交过程

AC

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1000+20, INF=0x3f3f3f3f;
char str[maxn];
bool isloop[maxn][maxn];
int dp[maxn];

int main(void){
    int T;

    scanf("%d", &T);
    while (T--){
        scanf("%s", str);

        int n=strlen(str);
        memset(isloop, false, sizeof(isloop));
        for (int i=0; i<n; i++){
            isloop[i][i]=true;
            for (int j=1; i-j>=0 && i+j<n; j++)
                if (str[i-j]==str[i+j])
                    isloop[i-j][i+j]=true;
                else break;

            if (i<n-1) for (int j=0; i-j>=0 && i+1+j<n; j++){
                if (str[i-j]==str[i+j+1])
                    isloop[i-j][i+j+1]=true;
                else break;
            }
        }

        dp[0]=1;
        for (int i=1; i<n; i++){
            dp[i]=INF;
            for (int j=i; j>=0; j--)
                if (isloop[j][i]){
                    if (j-1>=0) dp[i]=min(dp[i], dp[j-1]+1);
                    else dp[i]=1;
                }
        }printf("%d\n", dp[n-1]);
    }

    return 0;
}
Time Memory Length Lang Submitted
20ms None 1084 C++ 5.3.0 2018-08-06 05:41:42

以上是关于UVA-11584 Partitioning by Palindromes 动态规划 回文串的最少个数的主要内容,如果未能解决你的问题,请参考以下文章

UVA11584-Partitioning by Palindromes(动态规划基础)

题解UVA11584 Partitioning by Palindromes

uva 11584 Partitioning by Palindromes 线性dp

UVA 11584Partitioning by Palindromes

UVA11584 Partitioning by Palindromes

Partitioning by Palindromes UVA - 11584