uva11584 Partitioning by Palindromes

dp[i]表示到字符串扫描到第i个时所需的最小集合数。

dp[i] = min(dp[j - 1] + 1) 字符串[j,i]是回文串&& 0 <= j <= i。

这里要注意写成dp[i] = min (dp[j])是不对的,因为dp[j]表示的是到j时的最少集合,也就数是以j为某一个回文串的结尾(单独一个字符也是一个回文串),而我们要的是以j为回文串[j,i]的开头。

#include <iostream>
#include<stdio.h>
#include<cstring>
#define INF 10000000
using namespace std;

char s[1010];
int dp[1010];
bool pali(int a,int b)//判断是否为回文串
{
  while(a < b)
  {
     if(s[a] != s[b])    return false;
     a++;
     b--;
   }
    return true;
}

int main()
{
    int t;
    scanf("%d\n",&t);
    while(t--)
    {
        scanf("%s",s);
        int len = strlen(s);
        dp[0] = 1; //dp[i]表示到i的最少集合
        for(int i = 1;i < len;i++)
        {
            dp[i] = i+1;
            for(int j = 0;j <= i;j++)
            {
                if(pali(j,i)) { dp[i] = min(dp[i],dp[j - 1] + 1);}
            }
        }
        printf("%d\n",dp[len - 1]);
    }
    return 0;
}


你可能感兴趣的:(uva11584 Partitioning by Palindromes)