您的位置:首页 > 大数据 > 人工智能

【 2013 Multi-University Training Contest 8 】

2013-08-15 18:20 441 查看
HDU 4678 Mine

对于每个空白区域,求SG值。

最后异或起来等于0,先手必败。

#include<cstdio>
#include<cstring>
#include<vector>
#define MAXN 1010
using namespace std;
char a[MAXN], b[MAXN], c[MAXN];
vector<pair<int, int> > p1, p2;
int f[MAXN][MAXN], g[MAXN][MAXN];
void cal(char a[], char c[], vector<pair<int, int> >&p) {
int i, j, k;
int la = strlen(a + 1);
int lc = strlen(c + 1);
p.clear();
for (i = 1; i <= la; i++) {
k = 1;
if (a[i] != c[k]) {
continue;
}
for (j = i; j <= la; j++) {
if (a[j] == c[k]) {
k++;
}
if (k > lc) {
break;
}
}
if (k > lc) {
p.push_back(make_pair(i, j));
}
}
}
int main() {
int T;
int ca = 1;
int ans;
int i, j;
int la, lb, lc;
scanf("%d", &T);
while (T--) {
scanf(" %s %s %s", a + 1, b + 1, c + 1);
la = strlen(a + 1);
lb = strlen(b + 1);
lc = strlen(c + 1);
cal(a, c, p1);
cal(b, c, p2);
ans = 0;
if (!(p1.empty() || p2.empty())) {
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
for (i = 1; i <= la; i++) {
for (j = 1; j <= lb; j++) {
if (a[i] == b[j]) {
f[i][j] = f[i - 1][j - 1] + 1;
} else {
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
}
}
}
for (i = la; i > 0; i--) {
for (j = lb; j > 0; j--) {
if (a[i] == b[j]) {
g[i][j] = g[i + 1][j + 1] + 1;
} else {
g[i][j] = max(g[i + 1][j], g[i][j + 1]);
}
}
}
for (i = 0; i < (int) p1.size(); i++) {
for (j = 0; j < (int) p2.size(); j++) {
ans = max(ans,
lc + f[p1[i].first - 1][p2[j].first - 1]
+ g[p1[i].second + 1][p2[j].second + 1]);
}
}
}
printf("Case #%d: %d\n", ca++, ans);
}
return 0;
}


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