Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <string>
- #define N 2005
- #define INF int(1e6)
- using namespace std;
- int dp[N][N][2][2], m, n, add[2][2][2], res;
- pair<int, int> from[N][N][2][2];
- string s = "GB", answer;
- void ans(int pos, int pos2, int ind1, int ind2) {
- if (pos > 1) {
- ans(pos - 1, from[pos][pos2][ind1][ind2].first, from[pos][pos2][ind1][ind2].second, ind1);
- }
- answer += s[ind1];
- }
- int main() {
- freopen("table.in", "r", stdin);
- freopen("table.out", "w", stdout);
- cin >> m >> n;
- add[0][1][0] = add[0][0][1] = add[1][0][0] = 1;
- for (int end1 = 0; end1 < 2; end1++)
- for (int end2 = 0; end2 < 2; end2++) {
- for (int i = 0; i < m + n; i++)
- for (int i2 = 0; i2 <= m; i2++) {
- for (int k = 0; k < 2; k++)
- for (int l = 0; l < 2; l++) {
- dp[i][i2][k][l] = -INF;
- }
- }
- // cout << "_______________\n";
- for (int j = 0; j < 2; j++)
- for (int k = 0; k < 2; k++) {
- dp[1][j + k][j][k] = add[end1][end2][j] + add[end2][j][k];
- // fprintf(stdout, "dp[1][%d][%d][%d] = %d\n", j + k, j, k, dp[1][j + k][j][k]);
- }
- for (int i = 2; i < m + n; i++)
- for (int i2 = 0; i2 <= m; i2++) {
- for (int j = 0; j < 2; j++)
- for (int k = 0; k < 2; k++)
- for (int l = 0; l < 2; l++) {
- int next = (l ? 1 : 0);
- next += i2;
- if (dp[i][next][k][l] < dp[i - 1][i2][j][k] + add[j][k][l]) {
- dp[i][next][k][l] = dp[i - 1][i2][j][k] + add[j][k][l];
- // fprintf(stdout, "dp[%d][%d][%d][%d] = %d\n", i, next, k, l, dp[i][next][k][l]);
- from[i][next][k][l] = make_pair(i2, j);
- }
- }
- }
- if (dp[n + m - 1][m][end1][end2] > res) {
- res = dp[n + m - 1][m][end1][end2];
- answer = "";
- ans(n + m - 1, m, end1, end2);
- answer += s[end2];
- }
- }
- cout << answer << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement