解题思路
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#define ll long long
#define ldb long double
using namespace std;
const int maxn=2147483600;
int l,cnt,m,v[30],id[30],a[30][30],g[30][1<<20],f[1<<20];
char s[100010];
int main() {
scanf("%s",s+1);
l=strlen(s+1);
for(int i=1; i<=l; i++)
v[s[i]-'a']=1;
for(int i=0;i<26;i++)
if(v[i])
id[i]=cnt++;
m=(1<<cnt)-1;
for(int i=1;i<l;i++)
a[id[s[i]-'a']][id[s[i+1]-'a']]++;
for(int i=0;i<cnt;i++)
{
for(int j=0;j<cnt;j++)
{
for(int k=1<<j;k<=(2<<j)-1;k++)
g[i][k]=g[i][k-(1<<j)]+a[i][j];
}
}
memset(f,0x3f3f3f3f,sizeof(f));
f[0]=0;
for(int i=0;i<=m;i++)
{
for(int j=0;j<cnt;j++)
{
if(!(i&1<<j)){
f[i|1<<j]=min(f[i|1<<j],f[i]+g[j][i|1<<j]);
}
}
}
printf("%d",f[m]+1);
}
/*
mildredree*/