hautoj 1264 某科学的打麻将 【暴力匹配】

来源:互联网 发布:vivo软件 编辑:程序博客网 时间:2024/04/28 02:42


点击打开链接


1264: 某科学的打麻将

时间限制: 1 秒  内存限制: 64 MB
提交: 69  解决: 9
提交 状态 

题目描述

过年打麻将果然是一项必备技能(雾),打麻将的起手式是整理好自己手中的牌,现在你有十三张牌(只可能出现一万到九万,一筒到九筒,一条到九条),你要把这些牌整理好,使得相同花色的牌必须在连续的唯一一段(即所有的"万"要放在一起,所有的"条"要放在一起,所有的"筒"要放在一起。),每段内牌是按照从小到大的顺序排列(“万”,“条”,“筒”的顺序没有要求)。你每次只能将当前牌中的任意一张牌放到最左边或者最右边。请问最少经过多少次可以使得牌被整理好。

一万到九万,用数字1-9表示

一筒到九筒,用小写字母a-i表示

一条到九条,用大写字母A-I 表示

输入

第一行 一个数字T代表数据组数(T<=10000

接下来每行 13个字符 代表初始的牌

输出

T行每行一个数字,代表答案

样例输入

13abcABBDEFG11 

样例输出

1

这题,第一次看没思路, 最后看了网上的思路,

因为只有三种牌, 那么结果只会有6钟。

那么把六种结果全部枚举出来。

然后用每种结果子序列匹配,能匹配的就是不用移动的。


其实我还有个想法,直接可以把每种结果的字符映射成升序,然后着最长上升子序列 就是不用动的。


#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<vector>#include<algorithm>#define x first#define y second#define ll long longusing namespace std;const int mod=1e9+7;const int maxn=110050;int len;char s[20];char a[20],b[20],c[20];char t[20];int dp[20][20];int judge(){    int ret=0;    for(int i=1;i<=len;++i){        for(int j=1;j<=len;++j){            if(t[j]==s[i])dp[i][j]=dp[i-1][j-1]+1;            else dp[i][j]=dp[i-1][j];            ret=max(ret,dp[i][j]);        }    }    return len-ret;}int main(){    int T;    int ans;    scanf("%d",&T);    while(T--){        ans=20;        int la=0,lb=0,lc=0;        scanf("%s",s+1);        len=strlen(s+1);        for(int i=1;i<=len;++i){            if(isdigit(s[i])){                 a[++la]=s[i];            }else if(islower(s[i])){                 b[++lb]=s[i];            }else{                 c[++lc]=s[i];            }        }        sort(a+1,a+la+1);a[la+1]='\0';        sort(b+1,b+lb+1);b[lb+1]='\0';        sort(c+1,c+lc+1);c[lc+1]='\0';        memset(t,'\0',sizeof(t));        strcat(t+1,a+1);strcat(t+1,b+1);strcat(t+1,c+1);        ans=min(ans,judge());        memset(t,'\0',sizeof(t));        strcat(t+1,a+1);strcat(t+1,c+1);strcat(t+1,b+1);        ans=min(ans,judge());        memset(t,'\0',sizeof(t));        strcat(t+1,b+1);strcat(t+1,a+1);strcat(t+1,c+1);        ans=min(ans,judge());        memset(t,'\0',sizeof(t));        strcat(t+1,b+1);strcat(t+1,c+1);strcat(t+1,a+1);        ans=min(ans,judge());        memset(t,'\0',sizeof(t));        strcat(t+1,c+1);strcat(t+1,a+1);strcat(t+1,b+1);        ans=min(ans,judge());        memset(t,'\0',sizeof(t));        strcat(t+1,c+1);strcat(t+1,b+1);strcat(t+1,a+1);        ans=min(ans,judge());        printf("%d\n",ans);    }    return 0;}



0 0
原创粉丝点击