将其划分为尽可能少的回文串


dp[i] = min(dp[i],dp[j] + 1)    来表示j+1~i是回文串

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 0x3f3f3f3f
using namespace std;
char p[1005];
bool work(int i,int j)
{
    for(int k = 0; k <=(j-i)/2; k++)
        if(p[i+k] != p[j-k])
            return false;
    return true;
}
int dp[1005];
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        getchar();
        scanf("%s",p);
        int  len = strlen(p);
        for(int i = 0;i < len;i++)
            dp[i] = i+1;              //回文串为单个字母的情况
        for(int i = 0;i < len;i++)
        if(work(0,i))
            dp[i] = 1;                //包含首位的回文串
        for(int i = 0; i < len; i++)
            for(int j = 0; j < i; j++)
                if(work(j+1,i))       //j+1   从第二位开始判断
                    dp[i] = min(dp[i],dp[j] + 1);   
        printf("%d\n",dp[len-1]);
    }
    return 0;
}

  

相关文章:

  • 2021-10-14
  • 2022-12-23
  • 2021-09-11
  • 2021-07-23
  • 2021-09-17
  • 2021-12-04
  • 2021-12-11
猜你喜欢
  • 2021-08-04
  • 2022-12-23
  • 2022-12-23
  • 2021-08-08
  • 2021-11-12
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案