您的位置:首页 > 其它

计蒜客习题 消除字符串

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: