時間限制:1000mshtml
單點時限:1000msjava
內存限制:256MB算法
小Hi最近在玩一個字符消除遊戲。給定一個只包含大寫字母"ABC"的字符串s,消除過程是以下進行的:測試
1)若是s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"會被同時消除,餘下"AB"和"B"拼成新的字符串"ABB"。ui
2)上述消除會反覆一輪一輪進行,直到新的字符串不包含相鄰的相同字符爲止。例如」ABCCBCCCAA」通過一輪消除獲得"ABB",再通過一輪消除獲得"A"spa
遊戲中的每一關小Hi都會面對一個字符串s。在消除開始前小Hi有機會在s中任意位置(第一個字符以前、最後一個字符以後以及相鄰兩個字符之間)插入任意一個字符('A','B'或者'C'),獲得字符串t。t通過一系列消除後,小Hi的得分是消除掉的字符的總數。.net
請幫助小Hi計算要如何插入字符,才能得到最高得分。code
輸入第一行是一個整數T(1<=T<=100),表明測試數據的數量。htm
以後T行每行一個由'A''B''C'組成的字符串s,長度不超過100。blog
對於每一行輸入的字符串,輸出小Hi最高能獲得的分數。
第一組數據:在"ABCBCCCAA"的第2個字符後插入'C'獲得"ABCCBCCCAA",消除後獲得"A",總共消除9個字符(包括插入的'C')。
第二組數據:"AAA"插入'A'獲得"AAAA",消除後獲得"",總共消除4個字符。
第三組數據:不管是插入字符後獲得"AABC","ABBC"仍是"ABCC"都最多消除2個字符。
樣例輸入
3 ABCBCCCAA AAA ABC
樣例輸出
9 4 2
解題思路:
一、在給定字符串中的任意位置插入'A'、'B'、'C'中的任意一個字符,而後計算新字符串通過消除後最短的字符串長度;
二、在計算字符消除後最短長度時,只能一遍一遍地計算,我的沒有想出什麼更好的方法
三、記錄每次插入一個字符後通過第2步計算後最短的字符串長度min. 最後分值爲原字符串的長度 + 1 - min。
具體算法(java版,能夠被Accepted)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); for (int i = 0; i < n; i++) { StringBuilder builder = new StringBuilder(scanner.next()); int min = builder.length(); for (int j = 0; j <= builder.length(); j++) { for (char ch = 'A'; ch <= 'C'; ch++) { StringBuilder temp = new StringBuilder(builder); temp = temp.insert(j, ch); int count = trim(temp.toString()).length(); if (min > count) { min = count; } } } System.out.println(builder.length() + 1 - min); } scanner.close(); } static String trim(String input) { String result = input.replaceAll("([A|B|C])\\1{1,}", ""); if (result.equals(input)) { return result; } else { return trim(result); } } }
參考出處:
http://www.cnblogs.com/pinxiong/p/4047331.html
http://blog.csdn.net/jmlikun/article/details/48471243