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状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状 ...
随机推荐
- va_start、va_end、va_list的使用
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...); 2:函数参数的传递原理函数参数是以数据结构:栈的形式存 ...
- 让SecureCRT vi中显示多色彩
方法1: 1.打开SecureCRT___选项__会话选项___仿真 右边的中端选择linux,把ANSI 颜色和使用颜色方案打上钩. 2.选择外观,右边的使用颜色和闪烁都打上钩. 3.重新连接使所该 ...
- 配置ModSecurity防火墙与OWASP规则
中文译文参考:http://netsecurity.51cto.com/art/201407/446264.htm 英文原文参考:http://resources.infosecinstitute.c ...
- linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改
原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...
- 自己修改select的样式(修改select右边的小三角)
CSS就可以解决,原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可. select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ ...
- iOS Xcode8的适配
1.打开应用后打印了很多的log信息 解决方法: Xcode8里边 Edit Scheme... -> Run -> Arguments, 在Environment Variables里边 ...
- macos ssh host配置及免密登陆
windows下面有xshell 这样的可视化ssh管理工具 macos 下面使用终端做下简单配置,也非常方便,具体过程如下 生成秘钥 cd ~/.sshssh-keygen -t rsa 生成了私钥 ...
- Android自定义进度条
Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如ok,我们开始吧: 一)变换前背景 先来看看 ...
- Android(java)学习笔记157:使用Dexdump等工具进行反编译
使用Dex等工具进行反编译步骤: (1)首先找到Android软件安装包中的class.dex,把APK文件改名为".zip",然后解压缩其中的class.dex文件,这是Java ...
- youku的js脚本的工具函数和初始化方法
定义日志输出函数 (function(){ if(window['console']){ return; } window['console'] = { log: function(){} ,clea ...