SRM 551 DIV2

昨天晚上网络太不给力了,一言难尽啊,泪奔啊

 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 };
原文地址:https://www.cnblogs.com/kakamilan/p/2623789.html