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;
}

  

posted on 2012-12-16 20:57  夜->  阅读(170)  评论(0编辑  收藏  举报