uva 11552 Fewest Flops

題目大意:給你一個字符串,要你按每組k個按照順序進行分組,每組裏的字母順序任意,然後再按照組的順序拼起來,如果相鄰的幾個相同的字母算一個塊,拼起來後,最少的塊是多少?

所以要最小每組相同字母肯定在一起,所以每組枚舉結尾字母即可,dp[i][j] 表示 第i組  字母j 結尾 的最小值

如果第i組結尾和第i-1組結尾字母相同     如果 i組的  size==1   則 相等  否則 dp[i-1]    + size;  




#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
#define clr(a, x) memset(a, x, sizeof(a))
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)

const int maxn = 1010 ;
char str[maxn];
set<char>s[maxn];
int dp[maxn][30];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int k;
        scanf("%d",&k);
        scanf("%s",str);
        int len=strlen(str);
        int n=len/k;
        for(int i=0;i<=n;i++) s[i].clear();
        for(int i=0;i<len;i++)
        {
            s[i/k].insert(str[i]);
        }
        set<char>::iterator it,mt;
        for(it=s[0].begin();it!=s[0].end();it++)
        {
            dp[0][(*it)-'a']=(int)s[0].size();
        }

        for(int i=1;i<n;i++)
        {
            for(mt = s[i].begin();mt!= s[i].end();mt++)
            {
                dp[i][(*mt)-'a']=maxn;
                for(it= s[i-1].begin();it!=s[i-1].end();it++)
                {
                    if((*mt)==(*it)) dp[i][(*mt)-'a']=min(dp[i][(*mt)-'a'],dp[i-1][(*it)-'a']+(s[i].size()==1?0:(int)s[i].size()));
                    else
                    {
                        if( s[i].find((*it)) !=s[i].end())
                        {
                            dp[i][(*mt)-'a']=min(dp[i][(*mt)-'a'],dp[i-1][(*it)-'a']+(int)s[i].size()-1);
                        }
                        else
                        {
                            dp[i][(*mt)-'a']=min(dp[i][(*mt)-'a'],dp[i-1][(*it)-'a']+(int)s[i].size());
                        }
                    }
                }
            }
        }
        int ans=maxn;
        for(it= s[n-1].begin();it!=s[n-1].end();it++)
        {
            ans=min(ans,dp[n-1][(*it)-'a']);
        }
        printf("%d\n",ans);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章