HDU-4628 Pieces 如压力DP
鉴于他的字符串,每一个都能够删除回文子串。子可以是不连续,因此,像更好的模拟压力。求删除整个字符串需要的步骤的最小数量。
最大长度为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的更多相关文章
- hdu 4628 Pieces 状态压缩dp
Pieces Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- hdu 4628 Pieces 状压dp
题目链接 枚举所有状态, 1表示这个字符还在原来的串中, 0表示已经取出来了. 代码中j = (j+1)|i的用处是枚举所有包含i状态的状态. #include <iostream> #i ...
- HDU 4628 Pieces(DP + 状态压缩)
Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...
- [kmp+dp] hdu 4628 Pieces
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 Reincarnation Time Limit: 6000/3000 MS (Java/Ot ...
- HDU 4628 Pieces(状压DP)题解
题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...
- hdu 4628 Pieces
http://acm.hdu.edu.cn/showproblem.php?pid=4628 状态压缩DP 时间复杂度应该是 16*(2^32) 但是运行时要远小于这个数 所以加一定剪枝就可以过 代码 ...
- HDU 4628 Pieces(状态压缩+记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索 ...
- hdu 4628 Pieces(状态压缩+记忆化搜索)
Pieces Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
随机推荐
- 改动EditPlus默认模板
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FvaGFpY2hlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 对ORA-01795: 列表中的最大表达式数为 1000的处理(算法:计算数量及切割)
/** * @category * 原:strIDs in ( 100001,100002,100003,....................,110001,120001,130001,1400 ...
- hibernate学习——Set集合配置
Set集合的配置 数据表的创建:表关系一个员工拥有多个身份 create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VAR ...
- Linux内核源代码的学习过程转换完成细节
linux中的进程是个最主要的概念,进程从执行队列到開始执行有两个開始的地方, 一个就是switch_to宏中的标号1:"1:/t",//仅仅要不是新创建的进程,差点儿都是从上面的 ...
- $('#checkbox').attr('checked'); 回报checked或undefined该解决方案
$('#checkbox').attr('checked'); 返回的是checked或者是undefined,不是原来的true和false了,有关此问题的解决方法例如以下 在JQ1.6之前的版本号 ...
- 转载:Raspberry Pi 树莓派入门
转载说明: 整理转载,原文链接http://www.eeboard.com/bbs/thread-5191-1-1.html 这篇帖子我打算用Q&A的方式来编写,这样大家更容易一目了然的看明整 ...
- Dubbo-Admin管理平台和Zookeeper注册中心的搭建(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubb ...
- 使用 WPF 创建预加载控件
Introduction At the time when WPF applications do a very long process like getting response from a w ...
- OpenJDK 阅读源代码 Java 实现字节流输入类
Java 的输入输出总是给人一种非常混乱的感觉.要想把这个问题搞清楚.必须对各种与输入输出相关的类之间的关系有所了解. 仅仅有你了解了他们之间的关系.知道设计这个类的目的是什么.才干更从容的使用他们. ...
- SQL server 2005 PIVOT运算符的使用
原文:SQL server 2005 PIVOT运算符的使用 PIVOT,UNPIVOT运算符是SQL server 2005支持的新功能之一,主要用来实现行到列的转换.本文主要介绍PIVOT运算符的 ...