HDU4628】的更多相关文章

/* 状态压缩DP dp[ i ]:达到i状态的最小step. 题意:每次可以去掉一个回文串,求最少几步能取完. */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<math.h> using…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 数据不大,枚举本质.首先对枚举出回文串,然后用DP或者搜索,这里因为层数不多,用bfs比较好,或者用IDA*... //STATUS:C++_AC_140MS_780KB #include <functional> #include <algorithm> #include <iostream> //#include <ext/rope> #include…
鉴于他的字符串,每一个都能够删除回文子串.子可以是不连续,因此,像更好的模拟压力.求删除整个字符串需要的步骤的最小数量. 最大长度为16,因此不能逐行枚举状态.首先预处理出来全部的的回文子串,然后从第一步開始,依次状压第i步能到达的状态.假设能达到母串,跳出. 还有初始化不要用图省事用memset. . 不优越的姿势+函数导致T了数发. #include <iostream> #include <cstdio> #include <cstring> #include &…
/*状态转移f[i]=min(f[i],f[j]+f[i^j]); 就是j状态+i^j状态=i状态,f[i]记录的是从i删除1要的最小步数*/ #include<string.h> #include<stdio.h> #include<algorithm> using namespace std; ; int f[N]; int n; ]; int min(int a,int b) { if(a<b) return a; return b; } int can(i…
题意:给一个长度为16的字符串,每次从里面删掉一个回文序列,求最少需要几次才能删掉所有字符 思路:二进制表示每个字符的状态,那么从1个状态到另一个状态有两种转移方式,一是枚举所有合法的回文子序列,判断是否是当前状态的子状态,再转移,二是枚举当前状态的所有子状态来转移.前者最坏复杂度O(2^16*2^16) = O(几十亿),而后者最坏只有(i:1->16)Σ2iC(16,i) = O(几千万). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20…