您的位置:首页 > 其它

hdu 4614 pieces 状态DP

2013-07-31 16:09 246 查看
题意:给你一个长度小于等于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[20];
int dp[(1<<16)+1];
int judge(int state)
{
int i;
int slen;
char s[20];
slen = 0;
for(i = 0;i < len;i++)
{
if(1<<i & state)
s[slen++] = str[i];
}
for(i = 0;i < slen/2;i++)
{
if(s[slen-i-1] != s[i])
return 0;
}

return 1;
}
int main()
{
scanf("%d",&t);
while(t--)
{
int i,j;
scanf("%s",str);
len = strlen(str);
dp[0] = 0;
for(i = 1;i < (1<<len);i++)
{
if(judge(i))
dp[i] = 1;
else
dp[i] = 20;
}

for(i = 1;i < (1<<len);i++)
{
for(j = (i-1)&i;j;j = (j-1)&i)
{
dp[i] = min(dp[i],dp[i^j]+dp[j]);
}
}

printf("%d",dp[(1<<len)-1]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: