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;
}