SRM 551 DIV2
2012-08-05 13:29
274 查看
昨天晚上网络太不给力了,一言难尽啊,泪奔啊
第二题
第三题是动态规划的题,代码不想写了/article/2565940.html
#include <iostream> #include <string> #include <vector> #include <cmath> #include <map> #include <algorithm> using namespace std; int judge[100]; class ColorfulBricks { public: int countLayouts(string bricks) { int count = 0; for (int i = 0; i < 100; i++) { judge[i] = 0; } for (int i = 0; i < bricks.size() ; i++) { int tmp = bricks[i] - 'A'; judge[tmp]++; } for (int i = 0; i < 100; i++) { if (judge[i] > 0) count++; } if (count > 2) return 0; else if (count == 2) return 2; else return 1; } };
第二题
#include <iostream> #include <string> #include <vector> #include <cstdlib> #include <cmath> #include <map> #include <algorithm> #include <list> using namespace std; class ColorfulChocolates { public: int max_num(map<int, map<int, int> > judge, int maxSwaps) {//以任意一个为中心,其他的都向它的方向交换 int judge_size = judge.size(); int ctertmp, ctermax; int step = 0; ctertmp = 1; ctermax = 1; for (int i = 0; i < judge_size; i++) { int left, right; left = i - 1; right = i + 1; ctertmp = 1; step = 0; while (left != -1 || right != judge_size) { int tmp; if (left != -1 && right != judge_size) { tmp = min((judge[i][left] - (i - left)), (judge[i][right] - (right - i))); if (tmp == (judge[i][left] - (i - left))) { left--; } else right++; } else if (right != judge_size) { tmp = (judge[i][right] - (right - i)); right++; } else if (left != -1) { tmp = (judge[i][left] - (i - left)); left--; } step = step + tmp; if (step > maxSwaps) break; ctertmp++; } ctermax = max(ctermax, ctertmp); } return ctermax; } int maximumSpread(string chocolates, int maxSwaps) { int myi, myj; int res = 1; for (int i = 0; i < 26; i++) { char tmp = 'A' + i; map<int, map<int, int> > judge; myi = myj = 0; for (int j = 0; j < chocolates.size(); j++) {//构造一个矩阵,记录第i个到第j个的距离 if (chocolates[j] == tmp) { myj = myi; for (int k = j + 1; k < chocolates.size(); k++) { if (chocolates[k] == tmp) { myj++; judge[myi][myj] = judge[myj][myi] = k - j; } } myi++; } } int tmpkaka = max_num(judge, maxSwaps); res = max(res, tmpkaka); } return res; } };
第三题是动态规划的题,代码不想写了/article/2565940.html
#include <iostream> #include <string> #include <vector> #include <cstdlib> #include <cmath> #include <map> #include <algorithm> #include <list> using namespace std; #define MOD 1000000007 int dp[3][3][51][51][51]; int cnt[3], n; class ColorfulCupcakesDivTwo { public: int slove(int pos, int pre, int fst, int a, int b, int c) { if (a < 0 || b < 0 || c < 0) return 0; if (pos == n) return pre != fst; if (dp[fst][pre][a][b][c] != -1) return dp[fst][pre][a][b][c]; int ret = 0; if (pos == 0) { ret = (ret + slove(pos + 1, 0, 0, a - 1, b, c)) % MOD; ret = (ret + slove(pos + 1, 1, 1, a, b - 1, c)) % MOD; ret = (ret + slove(pos + 1, 2, 2, a, b, c - 1)) % MOD; } else if (pre == 0) { ret = (ret + slove(pos + 1, fst, 1, a, b - 1, c)) % MOD; ret = (ret + slove(pos + 1, fst, 2, a, b, c - 1)) % MOD; } else if (pre == 1) { ret = (ret + slove(pos + 1, fst, 0, a - 1, b, c)) % MOD; ret = (ret + slove(pos + 1, fst, 2, a, b, c - 1)) % MOD; } else if (pre == 2) { ret = (ret + slove(pos + 1, fst, 0, a - 1, b, c)) % MOD; ret = (ret + slove(pos + 1, fst, 1, a, b - 1, c)) % MOD; } return dp[fst][pre][a][b][c] = ret; } int countArrangements(string cupcakes) { cnt[0] = cnt[1] = cnt[2] = 0; n = cupcakes.size(); for (int i = 0; i < n; i++) cnt[cupcakes[i] - 'A']++; memset(dp, -1, sizeof(dp)); return slove(0, 0, 0, cnt[0], cnt[1], cnt[2]); } };
相关文章推荐
- [矩阵树定理 容斥 meet in middle] Topcoder SRM 551 DIV1 Hard. SweetFruits
- 【TopCoder SRM 551 Div2】Solutions
- [meet in middle 矩阵树定理 容斥原理] SRM 551 div1 SweetFruits
- TC SRM 551 div2 题解
- SRM 551 Div1
- SRM 551 div2 950(DP, 环形+优化)
- SRM 551 div2
- TopCoder SRM 677 Div. 2 550 - FourStrings (枚举)
- TopCoder SRM 657 DIV 1
- topcoder SRM 593 DIV2 RaiseThisBarn
- [TopCoder] SRM 580 DIV 2, 250p, 500p, 1000p, Solution
- SRM 552 DIV2
- SRM 697 div1 hard
- SRM 555 DIV 2
- TopCoder SRM 595 Div2 第3题
- topcoder srm 425 div1
- SRM 531 div1 600/300 div2 950
- SRM 144 DIV2
- SRM 661 #DIV2
- SRM 599 DIV 2