1. 程式人生 > >Partitioning by Palindromes—最小組成迴文串(區間dp)

Partitioning by Palindromes—最小組成迴文串(區間dp)

題目連結:Partitioning by Palindromes UVA - 11584 


題意:輸入一個有小寫字母組成的字串,你的任務是將它劃分成儘量少的迴文串

思路:dp[i]代表到第i位的最小值,列舉它的前幾位求出最小值,為了方便列舉整個長度我們 從str[1]開始輸入

程式碼如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#define inf 1e6
using namespace std;
typedef long long ll;
char arr[1010];
int dp[1010];
bool Find(int l,int r)  //   判斷是否為迴文串
{
    for(int i=l,j=r;i<j;i++,j--){
        if(arr[i]!=arr[j])
            return false;
    }
    return true;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s",arr+1);
        memset(dp,0,sizeof(dp));
        int num=strlen(arr+1);
        for(int i=1;i<=num;i++){
            dp[i]=i;
            for(int j=1;j<=i;j++){
                if(Find(j,i))
                    dp[i]=min(dp[i],dp[j-1]+1);
            }
        }
        printf("%d\n",dp[num]);
    }
    return 0;
}