鉴于他的字符串,每一个都能够删除回文子串。子可以是不连续,因此,像更好的模拟压力。求删除整个字符串需要的步骤的最小数量。

最大长度为16,因此不能逐行枚举状态。首先预处理出来全部的的回文子串,然后从第一步開始,依次状压第i步能到达的状态。假设能达到母串,跳出。

还有初始化不要用图省事用memset。

不优越的姿势+函数导致T了数发。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <iomanip>
#include <vector>
#include <algorithm>
using namespace std;
char s[20];
char s1[20];
int ans;
int num;
int dp[1<<17][17];
int visit[20];
int Pow[15];
int a[1<<17];
bool solve(char str[])
{
int flag=1;
int start=0;
int end=strlen(str)-1;
while(start<=end)
{
if(str[start]!=str[end])
{
flag=0;
break;
}
start++;
end--;
}
if(flag)
{
return true;
}
else
{
return false;
}
}
int main()
{
int t;
int sum;
Pow[0]=1;
for(int i=1;i<=18;i++)
{
Pow[i]=Pow[i-1]*2;
}
scanf("%d",&t);
while(t--)
{
num=0;
scanf("%s",s);
int len=strlen(s);
int mos=1<<(len);
for(int i=1;i<=len;i++)
{
for(int j=1;j<mos;j++)
{
dp[j][i]=-1;
}
}
int len1;
s1[0] = '\0';
len1=0;
int p;
for(int i=1;i<mos;i++)
{
s1[0] = '\0';
len1=0;
for(int j=0;j<len;j++)
{
if(i&Pow[j])
{
s1[len1++]=s[j];
}
}
s1[len1]='\0';
//cout<<s1<<endl;
if(solve(s1))
{
a[num++]=i;
}
}
for(int i=1;i<=17;i++)
{
for(int j=0;j<num;j++)
{
if(i==1)
{
dp[a[j]][i]=1;
}
else
{
for(int k=1;k<mos;k++)
{
if(dp[k][i-1]!=-1)
{
if(a[j]&k)
{
continue;
}
dp[(k|a[j])][i]=1;
}
}
}
}
if(dp[mos-1][i]!=-1)
{
ans=i;
break;
}
}
printf("%d\n",ans);
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

HDU-4628 Pieces 如压力DP的更多相关文章

  1. hdu 4628 Pieces 状态压缩dp

    Pieces Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

  2. hdu 4628 Pieces 状压dp

    题目链接 枚举所有状态, 1表示这个字符还在原来的串中, 0表示已经取出来了. 代码中j = (j+1)|i的用处是枚举所有包含i状态的状态. #include <iostream> #i ...

  3. HDU 4628 Pieces(DP + 状态压缩)

    Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...

  4. [kmp+dp] hdu 4628 Pieces

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 Reincarnation Time Limit: 6000/3000 MS (Java/Ot ...

  5. HDU 4628 Pieces(状压DP)题解

    题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...

  6. hdu 4628 Pieces

    http://acm.hdu.edu.cn/showproblem.php?pid=4628 状态压缩DP 时间复杂度应该是 16*(2^32) 但是运行时要远小于这个数 所以加一定剪枝就可以过 代码 ...

  7. HDU 4628 Pieces(状态压缩+记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索  ...

  8. hdu 4628 Pieces(状态压缩+记忆化搜索)

    Pieces Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

  9. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

随机推荐

  1. restrictkeyword

    今天在移植ffmpeg到opencore时出现一个编译错误: /libavcodec/dsputil.c:545: error: expected ';', ',' or ')' before 'bl ...

  2. [置顶] 轻量级语言Lua入门

    作为一个脚本爱好者,而且是脚本(Perl)起家的我,一有空就喜欢学习下这些脚本语言.据说魔兽世界.愤怒小鸟都用到了它,所以今天研究下Lua这个叫法有点奇特的脚本 [转载请注明出处:http://blo ...

  3. 仿CSDN Blog返回页面顶部功能

    只修改了2个地方: 1,返回的速度-->改成了慢慢回去.(原来是一闪而返回) 2,返回顶部图标出现的时机-->改成了只要不在顶部就显示出来.(原来是向下滚动500px后才显示) 注意:JS ...

  4. ecshop加广告出现广告位的宽度值必须在1到1024之间的解决方法

    ecshop加广告出现广告位的宽度值必须在1到1024之间,这点是非常郁闷的,因为现在宽屏网站逐渐成为主流,越来越多的宽屏网站进入了我们的视线,比如京东啊,一号店啊. 但是ecshop的广告位却不能超 ...

  5. Android build-tools升级到23.0.0_rc1无法解决编译后的问题

    背景 作为项目要改变android studio,它采取了.他们主动向我,结果下载了最新的build-tools 23.0.0_rc1,然后,当我再次使用eclipse不了了.git reset了n次 ...

  6. AMD宣布裁员7% 约710员工将失去工作

    10 月 17 日.美国芯片生产商 AMD 周四宣布将裁员7%.并公布了不及预期的第四季度业绩展望.这将是 AMD 自 2011 年以来的第三轮大裁员. 就在一周之前,AMD 宣布罗瑞德(Rory R ...

  7. 23设计模式(3):Abstract Factory模式

    定义:要创建一组相关或依赖对象提供一个接口,而你并不需要指定其具体类别. 类型:创建一个类模型 类图: 抽象工厂模式与工厂方法模式的差别 抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者 ...

  8. hdu3530Subsequence rmq

    //使用rmq办,ma[i][j],同i作为一个起点2^j阵列的最大长度值 //启动枚举问最长的子列 //枚举的最大长度2^(j-1)和2^(j)z之间 //然后在该范围内找到 #include< ...

  9. 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性

    原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...

  10. 进程和线程之间的关系和区别 和 CPU牒

    流程具有一定独立功能的程序关于某个数据集合上的一次执行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立执行的基本单位. 进 ...