hdu 4614 pieces 状态DP

时间:2023-03-08 16:14:37

题意:给你一个长度小于等于16的字符串,每次可以删除一个回文传,问你最少删除干净的字数。

状态+dp

dp[i] = min(dp[i],dp[j]+dp[j^i]);(j是i的字串);

连接:http://acm.hdu.edu.cn/showproblem.php?pid=4628

代码:

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <queue>
#define loop(s,i,n) for(i = s;i < n;i++) using namespace std;
int len,t;
char str[];
int dp[(<<)+];
int judge(int state)
{
int i;
int slen;
char s[];
slen = ;
for(i = ;i < len;i++)
{
if(<<i & state)
s[slen++] = str[i];
}
for(i = ;i < slen/;i++)
{
if(s[slen-i-] != s[i])
return ;
} return ;
}
int main()
{
scanf("%d",&t);
while(t--)
{
int i,j;
scanf("%s",str);
len = strlen(str);
dp[] = ;
for(i = ;i < (<<len);i++)
{
if(judge(i))
dp[i] = ;
else
dp[i] = ;
} for(i = ;i < (<<len);i++)
{
for(j = (i-)&i;j;j = (j-)&i)
{
dp[i] = min(dp[i],dp[i^j]+dp[j]);
}
} printf("%d",dp[(<<len)-]);
}
return ;
}