您的位置:首页 > 其它

SRM 551 DIV2

2012-08-05 13:29 274 查看
昨天晚上网络太不给力了,一言难尽啊,泪奔啊

#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]);
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: