HDU 4628 Pieces(DP + 状态压缩)
Pieces
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628
题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除所需要的最少步数。比如: axbyczbea 可以一次删除掉 abcba 得到 xyze
集合上的动态规划。。。和点集配对很像,这里我先求出所有的回文串,然后dp。
设d[S]表示将集合S中的字母删除需要多少步,结果就是d[(1<<n)-1];
枚举所有的S,枚举所有S的子集sub;
状态转移方程:d[S] = min(d[S], d[S^sub)] + 1](如果sub是回文串~这样才算能减一步呀);
# include<cstdio>
# include<cstring>
# include<algorithm> using namespace std; const int maxn = + ;
const int INF = 0xffffff;
char s[maxn];
bool ispal[<<maxn]; //ispal[i]表示状态i是否是回文,2进制时1表示选择这个字符,0表示不选择这个字符
int d[<<maxn]; //d[S]表示将集合S中的字母删除需要多少步,结果就是d[(1<<n)-1]
int n; void getPal() //求出所有的回文串
{
int S, i, j;
for(S = ; S < (<<n); S++){ //状态S是否回文
bool ok = ;
int m = , buf[maxn]; //临时存储提取出来的字符
for(i = ; i < n; i++) if((<<i) & S){ //提取对应字符
buf[m++] = s[i];
}
for(i = , j = m-; i < j; i++, j--){ //判断回文
if(buf[i] != buf[j]){
ok = ;
break;
}
}
ispal[S] = ok;
}
} void dp(){
int S, sub;
d[] = ;
for(S = ; S < (<<n); S++){
d[S] = INF;
for(sub = S; sub > ; sub = (sub-) & S){ //sub = (sub-1) & S)保证是集合S中的字母
if(ispal[sub]) d[S] = min(d[S], d[S^sub] + ); //S^sub就是剩下的字符
}
}
} int main()
{
int T;
scanf("%d", &T);
while(T--){
scanf("%s", s);
n = strlen(s);
getPal();
dp();
printf("%d\n", d[(<<n)-]);
}
return ;
}
附贴标程:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int min(int a,int b){
return a<b ?a :b;
} const int MAX_N = , INF = 0xffffff;
int n;
int dp[ << MAX_N][MAX_N][MAX_N]; //rest,i,j
char s[MAX_N + ];
void work() {
int i,j,k;
scanf("%s", s);
n = strlen(s); for (i = ; i < n; i++) {
for (j = i; j < n; j++) {
dp[][i][j] = ;
}
} for (int rest = ; rest < ( << n); rest++) {
for (i = n - ; i >= ; i--) {
for (j = i; j < n; j++) {
//rest,i,j
int &ret = dp[rest][i][j] = INF;
if (i < j)
ret = min(dp[rest][i + ][j], dp[rest][i][j - ]);
if (s[i] == s[j] && ((rest >> i) & ) && ((rest >> j) & )) {
int nrest = rest & (~( << i)) & (~( << j));
if (nrest == )
ret = min(ret, dp[nrest][i][j] + );
else
ret = min(ret, dp[nrest][i][j]);
}
}
}
for (i = n - ; i >= ; i--) {
for (int j = i; j < n; j++) {
dp[rest][i][j] = min(dp[rest][i][j], dp[rest][][n - ] + );
}
}
} cout << dp[( << n) - ][][n - ] << endl;
} int main() {
int T;
cin >> T;
while (T--) {
work();
}
}
HDU 4628 Pieces(DP + 状态压缩)的更多相关文章
- 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 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [HDU 4842]--过河(dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4842 过河 Time Limit: 3000/1000 MS (Java/Others) Mem ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- hdu_4352_XHXJ's LIS(数位DP+状态压缩)
题目连接:hdu_4352_XHXJ's LIS 题意:这题花大篇篇幅来介绍电子科大的一个传奇学姐,最后几句话才是题意,这题意思就是给你一个LL范围内的区间,问你在这个区间内最长递增子序列长度恰为K的 ...
- 【bzoj1076】[SCOI2008]奖励关 期望dp+状态压缩dp
题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再 ...
- hdu4336 Card Collector(概率DP,状态压缩)
In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...
- dp状态压缩
dp状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状 ...
随机推荐
- 微软Build2014大会干货总结-2
继昨天微软在Build2014大会上宣布一系列重磅举措后,第二天的主题是微软云(Microsoft Azure)及开发者战略,CSDN记者继续从旧金山现场给您发来一线报道. 第二天的主角是新上任的微软 ...
- 可在Azure上运行.NET的SDK
本节包含前几个版本的 for .NET 的发行说明.有关早期版本的详细信息,请参阅早期版本:Azure SDK for .NET.有关 SDK 支持和停用的信息,请参阅 Azure SDK for . ...
- Mac IDEA快捷键积累
切来切去:Ctrl+Tab 在打开的不同类中切换来切换去 完美代码结构:Alt+Command+L 不同编辑点跳转:Alt+Command+↔️ 快速重写:Ctrl+N 快速选择代码:Alt+Shif ...
- HW3.17
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- POSIX-Centos查看rpm包安装位置及相关信息
rpm -qifl `which svnserve`; http://www.ctohome.com/FuWuQi/56/122.html [国外服务器及ip租用价格] Centos6 kvm网桥配置 ...
- [struts2]开启struts2开发模式
<constant name="struts.devMode" value="true" />
- 性能优化-列表类型转换(ConvertList<TSource, TResult>)
之前,在项目中看到过一段通用列表类型转换的代码,直接的实现便是用反射.大概看了下,它用在领域模型转DTO和SOA接口中契约实体的转换等等.首先,它使用了反射,其次,还是在循环中使用,便有了优化的想法. ...
- PTA 5-12 排序 (25分)
给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果. 本题旨在测试各种不同的排序算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:只有1个元素: 数据2:11个不相同的整数,测试 ...
- Ubuntu Server 12.04 静态IP简洁配置
PS:很长时间没使用Ubuntu了,刚才安装个Ubuntu Server 12.04做测试.Ubuntu的网络设置跟Redhat系是不一样的,配置IP时发现跟以前的Ubuntu桌面版本也有所不同,记录 ...
- 两个select级联操作实例(教师职称类型与职称)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...