每天一篇结题报告计划(2/∞)

今天要讲的是一篇很有意思的状压dp,数学课一直在想这题,然后一节课没听emmm。

Pieces

You heart broke into pieces.My string broke into pieces.
But you will recover one day,and my string will never go
back. Given a string s.We can erase a subsequence of
it if this subsequence is palindrome in one step. We
should take asfew steps as possible to erase the whole sequence.
How many steps do we need?
For example, we can erase abcba from axbyczbea and get xyze in one step.
input
The first line contains integer T,denote the number of the test cases.
Then T lines follows,each line contains the string s (1<= length of s <= 16).
T<=10.

output

For each test cases,print the answer in a line.
sample input
2
aa
abb

sample output

1
2
这道题一开始想的广搜然后想想复杂度就瑟瑟发抖了
然后开始考虑状态压缩
用二进制来表示一个数是否已经删去,1为删去,0为未删
dp[s]表示在s(转化为二进制)的情况下,最少需要几步
为了节省时间,我们做一次预处理,把所有回文子序列记录下来,并把对应的dp[s]改成1(回文子系列只用一次就能完成)
我们的目标是从0变成1111.....
字符串长度为len的话
我们要的目标状态就是1<<len-1(位运算)
如长度为4,目标为10000-1=1111
遍历0到1<<len-1,把这个状态和预处理出来的状态合并,得到新的状态,新状态的步数就等于原状态+1
那我就放代码了
#include<iostream>
#include<cstring>
using namespace std;
string str;
int len,dp[65537],cycle[65537],tot;//cycle是处理出来的回文子序列,tot记录个数
bool cle(int x)//判断x状态是否为回文
{  if(x==0){return true; }int i=0,j=len-1;  while(i<j){  while((x&(1<<i))==0)//找到子状态最左边的1i++;while((x&(1<<j))==0)//找到子状态最右边的1j--;if(str[i]!=str[j])return false;  i++;j--;  }  return true;
}
int main()
{int N;cin>>N;while(N--){tot=0;memset(dp,0x3F,sizeof(dp));//dp[0]=0;cin>>str;len=str.length();int maxx=(1<<len)-1;for(int i=1;i<=maxx;i++){if(cle(i)){dp[i]=1;cycle[++tot]=i;}}//cout<<tot<<endl;for(int i=1;i<=maxx;i++){for(int j=1;j<=tot;j++){if((i&cycle[j])==0){dp[i|cycle[j]]=min(dp[i|cycle[j]],dp[i]+1);//要判断在i的位上是否已有1存在}}}cout<<dp[maxx]<<endl;}
}

[HDU4628]解题报告,状态压缩dp相关推荐

  1. HDU4628+状态压缩DP

    1 /* 2 状态压缩DP 3 dp[ i ]:达到i状态的最小step. 4 题意:每次可以去掉一个回文串,求最少几步能取完. 5 */ 6 #include<stdio.h> 7 #i ...

  2. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  3. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

  4. POJ 2411 Mondriaan's Dream(状态压缩DP)

    题目链接 早就见过这个题,开始以为有公式的,推了几次没推出,后来知道这个题是状态压缩DP.最近开始看状态压缩,本想试着解出来,但是这个比那个牛吃草复杂多了...位运算还是不是很熟练,这个题的解题报告有 ...

  5. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  6. 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc

    糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述]    ...

  7. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  8. jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】

    正题 POJ链接:http://poj.org/problem?id=1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https: ...

  9. LeetCode 2044. 统计按位或能得到最大值的子集数目(状态压缩DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums ,请你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的数目 . 如果数组 a 可 ...

  10. LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 回溯 2.2 状态压缩DP 1. 题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] ...

最新文章

  1. 码云机房今晨出现网络故障,已经恢复
  2. 老男人面试第四家第五家-初创公司和b轮公司
  3. Lua中的模块和使用
  4. 从0开始架构一个IOS程序—— 05— NavigationBar 搭建首页面
  5. 全球搜索引擎盛会在即 呼叫搜索模式呼之欲出
  6. 企业运维经典面试题汇总(4)
  7. 【python VS Code】调用自定义模块 ModuleNotFoundError: No module named XXX
  8. 浏览器数据库 IndexedDB(一) 概述
  9. BootDo:源代码打包与自启动
  10. Oracle 后台进程初探
  11. R WinBugs network meta analysis
  12. frame和iframe的使用与总结
  13. git命令统计代码量
  14. 神经网络适用于什么问题,神经网络和计算机网络
  15. 孢子社群:今日推荐人工智能微信群:中国高端工业智造生态圈
  16. 前端之JS条件、循环语句
  17. 计算机专业逻辑推理题,逻辑推理试题
  18. ruby安装顺序简单讲解
  19. 可爱卡通系小学感恩教师节主题版本PPT模板
  20. [精品毕设]微信小程序ssm的自驾游拼团旅游网站自由行+后台vuejs

热门文章

  1. 从用户心理看游戏运营和推广
  2. 台式计算机磁盘视图怎么改,[极速u盘装系统]win7系统分配盘符“因为磁盘管理控制台视图不是...
  3. nTrun(快速启动软件) V2.0.1 简体中文绿色版是什么
  4. 利用pcl库实现简单单帧障碍物检测
  5. Smart3d五镜头空三失败问题解决
  6. mysql/hive求最大连续天数(间隔1天也算连续)
  7. 力扣93 - 复原IP地址【回溯算法】
  8. case when then else end 以及 if 用法
  9. AjaxPro 原理
  10. 15个产品经理问题,面试经常被问到!