Hi guys , i just tried the Epidemic in Monstropolis problem , hope you might like it .
#include
#include
#define MAXN 500
int a[MAXN];
int b[MAXN];
int partial_sums[MAXN];
unsigned char d[MAXN + 1][MAXN + 1];
unsigned char equals[MAXN + 1][MAXN + 1];
int ans[MAXN + 1][MAXN + 1];
int n, k;
int i, j, r, t;
int dif[2];
int order[2];
char symbol[2];
int main(int argc, char *argv[]) {
#ifndef ONLINE_JUDGE
freopen(“input.txt”, “r”, stdin);
//freopen(“output.txt”, “w”, stdout);
#endif
// read and init data
scanf(“%d”, &n);
for (i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
scanf("%d", &k);
for (i = 0; i < k; ++i) {
scanf("%d", &b[i]);
}
partial_sums[0] = a[0];
for (i = 1; i < n; ++i) {
partial_sums[i] = partial_sums[i - 1] + a[i];
}
d[0][0] = 1;
for (i = 0; i < n; ++i) {
equals[i][i] = 1;
}
for (i = 2; i <= n; ++i) {
for (j = 0; j <= n - i; ++j) {
equals[j][j + i - 1] = (equals[j][j + i - 2] && (a[j + i - 1] == a[j]));
}
}
// dynamic programming
for (i = 1; i <= n; ++i) {
int border = k;
if (i < k) {
border = i;
}
for (j = 1; j <= border; ++j) {
// int border2 = i - j + 1;
for (r = 1; r <= i; ++r) {
int sub_sum = partial_sums[i - 1] - partial_sums[i - r] + a[i - r];
unsigned char can_be_used = ((r == 1) || !equals[i - r][i - 1]);
unsigned char check = (can_be_used && (sub_sum == b[j - 1]));
if (d[i - r][j - 1] && check) {
d[i][j] = 1;
ans[i][j] = r;
break;
}
}
}
}
if (!d[n][k]) {
printf("NO\n");
} else {
printf("YES\n");
int curn = n;
int curk = k;
while (curn > 0) {
// print result
int maxval = -1;
int maxindx = curn;
for (i = curn – ans[curn][curk] + 1; i <= curn; ++i) {
if (a[i - 1] > maxval) {
maxval = a[i – 1];
maxindx = i;
}
}
int left_cnt = maxindx – curn + ans[curn][curk] – 1;
int right_cnt = curn – maxindx;
dif[0] = 0; dif[1] = -1;
order[0] = right_cnt; order[1] = left_cnt;
symbol[0] = ‘R’; symbol[1] = ‘L’;
if (left_cnt == 0) {
while (maxindx < curn && a[maxindx] == maxval) {
maxindx++;
left_cnt++;
right_cnt--;
}
dif[0] = 0; dif[1] = -1;
order[0] = right_cnt; order[1] = left_cnt;
symbol[0] = 'R'; symbol[1] = 'L';
} else if (right_cnt == 0 || a[maxindx] == a[maxindx - 1]) {
dif[0] = -1; dif[1] = 0;
order[0] = left_cnt; order[1] = right_cnt;
symbol[0] = 'L'; symbol[1] = 'R';
}
for (j = 0; j < 2; ++j) {
for (i = 0; i < order[j]; ++i) {
printf("%d %c\n", maxindx, symbol[j]);
maxindx += dif[j];
}
}
curn -= ans[curn][curk];
curk -= 1;
}
}
return 0;
}