http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2536
http://codeforces.com/problemset/problem/154/A
简单dp
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int N=100005;
bool can[27][27];
string s;
int ans[N][27];
int main()
{
//freopen("data.in","r",stdin);
while(cin>>s)
{
int n=s.size();
memset(can,true,sizeof(can));
int m;
cin>>m;
while(m--)
{
char a,b;
cin>>a>>b;
can[a-'a'][b-'a']=false;
can[b-'a'][a-'a']=false;
}
memset(ans,0,sizeof(ans));
ans[0][s[0]-'a']=1;
for(int i=0;i<n-1;++i)
{
int l=s[i+1]-'a';
ans[i+1][l]=max(ans[i+1][l],1);
for(int j=0;j<26;++j)
{
ans[i+1][j]=max(ans[i+1][j],ans[i][j]);
if(can[j][l])
ans[i+1][l]=max(ans[i+1][l],ans[i][j]+1);
}
}
int tmp=0;
for(int i=0;i<27;++i)
tmp=max(tmp,ans[n-1][i]);
cout<<(n-tmp)<<endl;
}
return 0;
}