计蒜客习题 消除字符串
2018-03-08 19:33
260 查看
用二进制表示字符串中每个字母的选取状态 然后dp
isp(i)函数判断传入的选取方式i对应子序列是否回文
点击打开链接
#include<bits/stdc++.h>
using namespace std;
int n;
#define maxs (1<<n)
const int inf=0x3f3f3f3f;
string s;
int dp[1<<16];
inline bool isp(int t){
string c;
int cnt=0;
for(;t;t>>=1){
if(t&1){
c+=s[cnt];
}
cnt++;
}
int l=c.length();
int m=l>>1;
l--;
for(int i=0;i<=m;i++)
{
if(c[i]!=c[l-i])
return false;
}
dp[t]=1;
return true;
}
inline void pre(){
for(int i=1;i<(1<<n);i++) //没有不选字符的情况 所以i从1开始
{
dp[i]=isp(i)?1:inf;
for(int j=i;j;j=(j-1)&i){
dp[i]=min(dp[i],dp[j]+dp[j^i]);
}
}
}
int main(){
cin>>s;
n=s.length();
memset(dp,inf,sizeof(dp));
pre();
printf("%d",dp[maxs-1]);
return 0;
}
isp(i)函数判断传入的选取方式i对应子序列是否回文
点击打开链接
#include<bits/stdc++.h>
using namespace std;
int n;
#define maxs (1<<n)
const int inf=0x3f3f3f3f;
string s;
int dp[1<<16];
inline bool isp(int t){
string c;
int cnt=0;
for(;t;t>>=1){
if(t&1){
c+=s[cnt];
}
cnt++;
}
int l=c.length();
int m=l>>1;
l--;
for(int i=0;i<=m;i++)
{
if(c[i]!=c[l-i])
return false;
}
dp[t]=1;
return true;
}
inline void pre(){
for(int i=1;i<(1<<n);i++) //没有不选字符的情况 所以i从1开始
{
dp[i]=isp(i)?1:inf;
for(int j=i;j;j=(j-1)&i){
dp[i]=min(dp[i],dp[j]+dp[j^i]);
}
}
}
int main(){
cin>>s;
n=s.length();
memset(dp,inf,sizeof(dp));
pre();
printf("%d",dp[maxs-1]);
return 0;
}
相关文章推荐
- 庞果网在线编程字符串消除问题ruby解答
- Java消除字符串换行、空格方法
- (C#习题) 字符串
- 数据结构与算法(33)——字符串习题
- jeapedu 20 字符串习题答案
- hihoCoder:1039字符串消除
- jeapedu 27 字符串与两重循环习题2图解
- 计蒜客习题:逃跑
- 计蒜客 字符串长度
- 计蒜客习题:打印锯齿矩阵
- 计蒜客-习题 四平方和
- 算法习题20:把字符串转换成整数并输出
- C++程序习题-将字符串按逆序输出[1.15]
- hihoCoder 字符消除 (字符串处理)(枚举)
- 小甲鱼Python教程第15讲--python字符串格式化笔记及习题答案
- [BNUZOJ1261][ACM][2016北理校赛]方块消除(栈,字符串)
- (十一)黑马程序员——关于字符串和数组的习题总结(补充)
- java习题--字符串运算和拼接
- 字符串消除
- 习题8-8 判断回文字符串(20 分)