hdu(4628)Pieces

本文介绍了一种使用状态压缩动态规划的方法来解决给定字符串中删除所有字符所需的最少删除次数问题,特别关注于如何识别并利用回文子串进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给定一个串,每次可以删除一个回文子串,问把全串删干净的最少次数。

思路:

用状态压缩把所有的状态枚举出来,用数组记录所表示状态所有字符被删除干净的最少次数

如果是回文串则dp为一,不然则为无穷大;

用fun来处理是否为回文串,然后就用dp即、解决了,。。。

#include"stdio.h"
#include"string.h"
int dp[1<<18];
char a[22],s[22];
#define min(a,b) a>b?b:a
int len;
void fun()
{
 int i,j,k;
 memset(dp,0x3f,sizeof(dp));
 for(i=1;i<(1<<len);i++)
 {
  k=0;
  for(j=0;j<len;j++)
  {
   if(i&1<<j)
    a[k++]=s[j];
  }
  a[k]='\0';
  for(j=0;j<k;j++)
  {
   if(a[j]!=a[k-j-1])
   break;
  }
  if(j==k)
   dp[i]=1;
 }
}
int main()
{
 int i,j,k;
 scanf("%d",&k);
 while(k--)
 {
  scanf("%s",s);
  len=strlen(s);
  fun();
  for(i=1;i<(1<<len);i++)
  {
   for(j=i;j>0;j=(j-1)&i)
   {
    dp[i]=min(dp[i],dp[i^j]+dp[j]);
   }
  }
  printf("%d\n",dp[(1<<len)-1]);
 }
 return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值