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;
}
		
                                    




