---
# System prepended metadata

title: 13722 - Doraemon plays Tetris
tags: [recursion]

---

# 13722 - Doraemon plays Tetris
>author: Utin
###### tags: `recursion`

---

## Brief
See the code below

## Solution 0

```c=
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int x, step;
int tetris[20];
int dp[21][21][21][21][21][21];

int put(int index, int a, int b, int c, int d, int e);
int max(int a, int b);

int main() {
    int k;
    scanf("%d", &k);
    while(k--) {
        memset(dp, -1, sizeof(dp));
        scanf("%d %d", &step, &x);
        for(int t = 0; t < step; t++) {
            scanf("%d", &tetris[t]);
        }
        int ans = put(0, 0, 0, 0, 0, 0);
        if(ans == step) printf("Win\n");
        else printf("Lose at %d\n", ans + 1);
    }
}

int put(int index, int a, int b, int c, int d, int e) {
    if(a > x || b > x || c > x || d > x || e > x) return -1;
    if(dp[index][a][b][c][d][e] != -1) return dp[index][a][b][c][d][e];
    if(index >= step) return dp[index][a][b][c][d][e] + 1;

    int temp_ans;
    int local_max;
    if(tetris[index] == 1) {
        temp_ans = max(put(index+1, a+4, b, c, d, e), put(index+1, a, b+4, c, d, e));
        temp_ans = max(temp_ans, put(index+1, a, b, c+4, d, e));
        temp_ans = max(temp_ans, put(index+1, a, b, c, d+4, e));
        temp_ans = max(temp_ans, put(index+1, a, b, c, d, e+4));

        local_max = max(a, max(b, max(c, d)));
        temp_ans = max(temp_ans, put(index+1, local_max+1, local_max+1, local_max+1, local_max+1, e));
        if(local_max == a) {
            local_max = max(b, max(c, max(d, e)));
        }
        else {
            local_max = max(local_max, e);
        }
        temp_ans = max(temp_ans, put(index+1, a, local_max+1, local_max+1, local_max+1, local_max+1));
        return dp[index][a][b][c][d][e] = temp_ans + 1;
    }
    else if(tetris[index] == 2) {
        local_max = max(a, b);
        temp_ans = put(index+1, local_max+2, local_max+2, c, d, e);
        local_max = max(b, c);
        temp_ans = max(temp_ans, put(index+1, a, local_max+2, local_max+2, d, e));
        local_max = max(c, d);
        temp_ans = max(temp_ans, put(index+1, a, b, local_max+2, local_max+2, e));
        local_max = max(d, e);
        temp_ans = max(temp_ans, put(index+1, a, b, c, local_max+2, local_max+2));
        return dp[index][a][b][c][d][e] = temp_ans + 1;
    }
    else if(tetris[index] == 3) {
        local_max = max(b+1, max(a, c));
        temp_ans = put(index+1, local_max+1, local_max+2, local_max+1, d, e);
        local_max = max(c+1, max(b, d));
        temp_ans = max(temp_ans, put(index+1, a, local_max+1, local_max+2, local_max+1, e));
        local_max = max(d+1, max(c, e));
        temp_ans = max(temp_ans, put(index+1, a, b, local_max+1, local_max+2, local_max+1));
        return dp[index][a][b][c][d][e] = temp_ans + 1;
    }
    else if(tetris[index] == 4) {
        local_max = max(max(a, b), c-1);
        temp_ans = put(index+1, local_max+1, local_max+2, local_max+2, d, e);
        local_max = max(max(b, c), d-1);
        temp_ans = max(temp_ans, put(index+1, a, local_max+1, local_max+2, local_max+2, e));
        local_max = max(max(c, d), e-1);
        temp_ans = max(temp_ans, put(index+1, a, b, local_max+1, local_max+2, local_max+2));

        local_max = max(a-1, b);
        temp_ans = max(temp_ans, put(index+1, local_max+3, local_max+2, c, d, e));
        local_max = max(b-1, c);
        temp_ans = max(temp_ans, put(index+1, a, local_max+3, local_max+2, d, e));
        local_max = max(c-1, d);
        temp_ans = max(temp_ans, put(index+1, a, b, local_max+3, local_max+2, e));
        local_max = max(d-1, e);
        temp_ans = max(temp_ans, put(index+1, a, b, c, local_max+3, local_max+2));
        return dp[index][a][b][c][d][e] = temp_ans + 1;
    }
}

int max(int a, int b) {
    if(a > b) return a;
    else return b;
}
// By Utin
```

## Reference