Submission #1339033

#TimeUsernameProblemLanguageResultExecution timeMemory
1339033hoangtien69Collecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
127 ms132160 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 205;
const int INF = 1e18;

int n, len;
int x[MAXN];
int t[MAXN];
int dp[MAXN][MAXN][MAXN][2];

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> len;
    for (int i = 1; i <= n; i++)
    {
        cin >> x[i];
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> t[i];
    }
    x[0] = 0;
    x[n + 1] = len;
    t[0] = -INF;
    t[n + 1] = -INF;
    for (int i = 0; i <= n + 1; i++)
    {
        for (int j = 0; j <= n + 1; j++)
        {
            for (int k = 0; k <= n; k++)
            {
                for (int l = 0; l <= 1; l++)
                {
                    dp[i][j][k][l] = INF;
                }
            }
        }
    }
    dp[0][n + 1][0][0] = 0;
    dp[0][n + 1][0][1] = 0;
    for (int i = 0; i <= n; i++)
    {
        for (int j = n + 1; j - 1 > i; j--)
        {
            for (int k = 0; k < n; k++)
            {
                for (int l = 0; l <= 1; l++)
                {
                    if (dp[i][j][k][l] > 1e12)
                    {
                        continue;
                    }
                    if (l == 0)
                    {
                        int cur = dp[i][j][k][l] + x[i + 1] - x[i];
                        if (cur > t[i + 1])
                        {
                            dp[i + 1][j][k][0] = min(dp[i + 1][j][k][0], cur);
                        }
                        else
                        {
                            dp[i + 1][j][k + 1][0] = min(dp[i + 1][j][k + 1][0], cur);
                        }
                        int cur1 = dp[i][j][k][l] + len - (x[j - 1] - x[i]);
                        if (cur1 > t[j - 1])
                        {
                            dp[i][j - 1][k][1] = min(dp[i][j - 1][k][1], cur1);
                        }
                        else
                        {
                            dp[i][j - 1][k + 1][1] = min(dp[i][j - 1][k + 1][1], cur1);
                        }
                    }
                    else
                    {
                        int cur = dp[i][j][k][l] + x[j] - x[j - 1];
                        if (cur > t[j - 1])
                        {
                            dp[i][j - 1][k][1] = min(dp[i][j - 1][k][1], cur);
                        }
                        else
                        {
                            dp[i][j - 1][k + 1][1] = min(dp[i][j - 1][k + 1][1], cur);
                        }
                        int cur1 = dp[i][j][k][l] + len - (x[j] - x[i + 1]);
                        if (cur1 > t[i + 1])
                        {
                            dp[i + 1][j][k][0] = min(dp[i + 1][j][k][0], cur1);
                        }
                        else
                        {
                            dp[i + 1][j][k + 1][0] = min(dp[i + 1][j][k + 1][0], cur1);
                        }
                    }
                }
            }
        }
    }
    for (int k = n; k >= 0; k--)
    {
        for (int i = 0; i <= n + 1; i++)
        {
            for (int j = 0; j <= n + 1; j++)
            {
                for (int l = 0; l <= 1; l++)
                {
                    if (dp[i][j][k][l] < INF)
                    {
                        cout << k;
                        return 0;
                    }
                }
            }
        }
    }
    cout << 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...