時間限制: 1 秒
記憶體限制: 64 mb
提交: 74
解決: 11 提交
狀態 題目描述
過年打麻將果然是一項必備技能(霧),打麻將的起手式是整理好自己手中的牌,現在你有十三張牌(只可能出現一萬到九萬,一筒到九筒,一條到九條),你要把這些牌整理好,使得相同花色的牌必須在連續的唯一一段(即所有的"萬"要放在一起,所有的"條"要放在一起,所有的"筒"要放在一起。),每段內牌是按照從小到大的順序排列(「萬」,「條」,「筒」的順序沒有要求)。你每次只能將當前牌中的任意一張牌放到最左邊或者最右邊。請問最少經過多少次可以使得牌被整理好。
一萬到九萬,用數字1-9表示
一筒到九筒,用小寫字母a-i表示
一條到九條,用大寫字母a-i 表示 輸入
第一行 乙個數字t代表資料組數(t<=10000)
接下來每行 13個字元 代表初始的牌 輸出
t行每行乙個數字,代表答案
樣例輸入
1樣例輸出3abcabbdefg11
1提示
樣例解釋
我們把3
放到 最右邊就好了
abcabbdefg113
題目分析:最終狀態有6種,我們需要列舉每一種情況並統計移動次數的最小值。對於一種情況來說,我們求最小值的方法如下:
假如字串的初始狀態為s:aabcbdaec
為了清晰沒有寫全,結束狀態t:aaabbccde
匹配的原則是:在s中抽取一部分字元按其位置的順序排成字串,這個字串是t的子串,假設我們選取aabcbdaec 組成aabbc,aabbc就是t的乙個子串,而s變成t的其中一種方式就是將其餘的字元按順序移動到相應的位置,對於s是將a移動到左邊,cde移動到右邊,這樣做的原理是規則要求只能將乙個字元移到左邊或者右邊,沒有移動過的字元(紅色)相對位置是不變的,並且紅色字元最後會在中間組合在一起,而周圍的字元可以隨意組合並且組合方式與移動次數無關,可以直接算出移動次數。這樣就要求紅色字串必須為t的子串,而我們需要求可匹配的最大子串長度。
注意這裡有誤導,就是t是按大小排序的,但不是求最長上公升子串行,因為最長上公升子串行不一定是子串,如上文最長上公升子串行aabcde,但不是子串。
具體實現dp就好了,dp[i][j]表示s的前i個和t的前j個字元最大匹配長度,遞推公式:dp[i][j]=dp[i-1][j-1](s[i]=t[j])||dp[i-1][j](s[i]!=t[j])
//
// main.cpp
// 某科學的打麻將2
//// created by teddywang on 2017/4/27.
//#include #include#include#includeusing namespace std;
int t;
char s[14];
char tnumb[14],tlow[14],tupp[14];
int len=13;
int ln,ll,lu;
int ans;
char buf[14];
int dp[20][20];
int solve()
sort(tupp,tupp+lu);
sort(tlow,tlow+ll);
sort(tnumb,tnumb+ln);
memset(buf,0,sizeof(buf));
strcat(buf,tupp);strcat(buf,tlow);strcat(buf,tnumb);
ans=solve();
memset(buf,0,sizeof(buf));
strcat(buf,tupp);strcat(buf,tnumb);strcat(buf,tlow);
ans=min(ans,solve());
memset(buf,0,sizeof(buf));
strcat(buf,tlow);strcat(buf,tupp);strcat(buf,tnumb);
ans=min(ans,solve());
memset(buf,0,sizeof(buf));
strcat(buf,tlow);strcat(buf,tnumb);strcat(buf,tupp);
ans=min(ans,solve());
memset(buf,0,sizeof(buf));
strcat(buf,tnumb);strcat(buf,tlow);strcat(buf,tupp);
ans=min(ans,solve());
memset(buf,0,sizeof(buf));
strcat(buf,tnumb);strcat(buf,tupp);strcat(buf,tlow);
ans=min(ans,solve());
printf("%d\n",ans);
}}
武大校賽E題
題意是給定一副無向圖,然後求走了t步之內,從起點到終點有多少走法,有個地方題面沒有說清楚,就是走到點n之後不能再往別的點走了 鄰接矩陣,乘t次之後,map i j 就是從i點走到j點的且走t步時的走法。我們把矩陣中n到其他點的路徑去掉,所以我們要算的就是 map 1 n i 1 i t 就是答案了 ...
2020西工大校賽 C王國(LCA)
典型的樹上求兩點間距離最大值,lca的做法 這題要求同乙個陣營,不妨先將同屬乙個陣營的先存進陣列,之後每組進行比較 比較時取出深度最深的,因為這個一定是答案中兩點中的其中乙個答案,這是樹的性質,不妨可以想一想 includeusing namespace std typedef long long ...
廣工大校賽3 26 H題 字首和
今天是校賽的日子,為了慶祝這麼喜慶的日子,tmk打算買些禮物給女票 lsh慶祝一下。tmk進入了雪梨超市,然後剛踏入的一瞬間,店主就對 tmk說 恭喜你成為了本店第 2147483647 位顧客,本店在搞乙個活動,對本店第 2147483647 位顧客進行贈送活動。你先看看你有多少錢?tmk一摸口袋...