昨天晚上网络太不给力了,一言难尽啊,泪奔啊
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cmath> 5 #include <map> 6 #include <algorithm> 7 using namespace std; 8 9 int judge[100]; 10 class ColorfulBricks { 11 public: 12 int countLayouts(string bricks) { 13 int count = 0; 14 15 16 for (int i = 0; i < 100; i++) { 17 judge[i] = 0; 18 } 19 for (int i = 0; i < bricks.size() ; i++) { 20 int tmp = bricks[i] - 'A'; 21 judge[tmp]++; 22 } 23 24 for (int i = 0; i < 100; i++) { 25 if (judge[i] > 0) 26 count++; 27 } 28 if (count > 2) 29 return 0; 30 else if (count == 2) 31 return 2; 32 else 33 return 1; 34 } 35 36 };
第二题
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <algorithm> 8 #include <list> 9 using namespace std; 10 11 class ColorfulChocolates { 12 public: 13 int max_num(map<int, map<int, int> > judge, int maxSwaps) {//以任意一个为中心,其他的都向它的方向交换 14 int judge_size = judge.size(); 15 int ctertmp, ctermax; 16 int step = 0; 17 ctertmp = 1; 18 ctermax = 1; 19 for (int i = 0; i < judge_size; i++) { 20 int left, right; 21 left = i - 1; 22 right = i + 1; 23 ctertmp = 1; 24 step = 0; 25 while (left != -1 || right != judge_size) { 26 int tmp; 27 if (left != -1 && right != judge_size) { 28 tmp = min((judge[i][left] - (i - left)), 29 (judge[i][right] - (right - i))); 30 if (tmp == (judge[i][left] - (i - left))) { 31 left--; 32 } else 33 right++; 34 35 } else if (right != judge_size) { 36 tmp = (judge[i][right] - (right - i)); 37 right++; 38 } else if (left != -1) { 39 tmp = (judge[i][left] - (i - left)); 40 left--; 41 } 42 step = step + tmp; 43 if (step > maxSwaps) 44 break; 45 ctertmp++; 46 } 47 ctermax = max(ctermax, ctertmp); 48 } 49 return ctermax; 50 } 51 int maximumSpread(string chocolates, int maxSwaps) { 52 int myi, myj; 53 int res = 1; 54 for (int i = 0; i < 26; i++) { 55 char tmp = 'A' + i; 56 map<int, map<int, int> > judge; 57 myi = myj = 0; 58 for (int j = 0; j < chocolates.size(); j++) {//构造一个矩阵,记录第i个到第j个的距离 59 if (chocolates[j] == tmp) { 60 myj = myi; 61 for (int k = j + 1; k < chocolates.size(); k++) { 62 if (chocolates[k] == tmp) { 63 myj++; 64 judge[myi][myj] = judge[myj][myi] = k - j; 65 } 66 } 67 myi++; 68 } 69 } 70 int tmpkaka = max_num(judge, maxSwaps); 71 res = max(res, tmpkaka); 72 } 73 return res; 74 } 75 };
第三题是动态规划的题,代码不想写了http://blog.csdn.net/acm_cxlove/article/details/7831457
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <algorithm> 8 #include <list> 9 using namespace std; 10 #define MOD 1000000007 11 int dp[3][3][51][51][51]; 12 int cnt[3], n; 13 class ColorfulCupcakesDivTwo { 14 public: 15 int slove(int pos, int pre, int fst, int a, int b, int c) { 16 if (a < 0 || b < 0 || c < 0) 17 return 0; 18 if (pos == n) 19 return pre != fst; 20 if (dp[fst][pre][a][b][c] != -1) 21 return dp[fst][pre][a][b][c]; 22 int ret = 0; 23 if (pos == 0) { 24 ret = (ret + slove(pos + 1, 0, 0, a - 1, b, c)) % MOD; 25 ret = (ret + slove(pos + 1, 1, 1, a, b - 1, c)) % MOD; 26 ret = (ret + slove(pos + 1, 2, 2, a, b, c - 1)) % MOD; 27 } else if (pre == 0) { 28 ret = (ret + slove(pos + 1, fst, 1, a, b - 1, c)) % MOD; 29 ret = (ret + slove(pos + 1, fst, 2, a, b, c - 1)) % MOD; 30 } else if (pre == 1) { 31 ret = (ret + slove(pos + 1, fst, 0, a - 1, b, c)) % MOD; 32 ret = (ret + slove(pos + 1, fst, 2, a, b, c - 1)) % MOD; 33 } else if (pre == 2) { 34 ret = (ret + slove(pos + 1, fst, 0, a - 1, b, c)) % MOD; 35 ret = (ret + slove(pos + 1, fst, 1, a, b - 1, c)) % MOD; 36 } 37 return dp[fst][pre][a][b][c] = ret; 38 } 39 int countArrangements(string cupcakes) { 40 cnt[0] = cnt[1] = cnt[2] = 0; 41 n = cupcakes.size(); 42 for (int i = 0; i < n; i++) 43 cnt[cupcakes[i] - 'A']++; 44 memset(dp, -1, sizeof(dp)); 45 return slove(0, 0, 0, cnt[0], cnt[1], cnt[2]); 46 } 47 48 };