http://community.topcoder.com/stat?c=problem_statement&pm=12758&rd=15704
topcoder的题经常需要找规律,而不是蛮干。比如这题,一开始又陷入思维定势,想DP,还是枚举,都不太好。但仔细观察,拿数据尝试后发现,其实最终就是把球分成两堆,来一个颜色c,如果左边有,就放右边,反之亦然;如果左右都有,放哪都一样。
基于这个算法,可以用set模拟,又或者直接计数就行了。
#include <string> using namespace std; class LittleElephantAndBalls { public: int getNumber(string S); }; int LittleElephantAndBalls::getNumber(string S) { int countRed = 0; int countGreen = 0; int countBlue = 0; int result = 0; for (int i = 0; i < S.length(); i++) { result += (countRed + countGreen + countBlue); if (S[i] == 'R') countRed = min(countRed+1, 2); if (S[i] == 'G') countGreen = min(countGreen+1, 2); if (S[i] == 'B') countBlue = min(countBlue+1, 2); } return result; };