超内存70后85看帖子可dp[i][j - up[i - 1]]优化终于AC
查看原帖
超内存70后85看帖子可dp[i][j - up[i - 1]]优化终于AC
846948
caijin12138楼主2024/8/1 16:17
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <sstream>
#include <stack>
#include <cstdio>
#define ll long long
#define ull unsigned long long
#define ld long double
#define INF 0x3f3f3f3f
using namespace std;
int n, m, k, sum = 0;
int up[10005], down[10005];
bool vis[10005];
int dp[10005][1005]; // x和y
struct node
{
    int back, top;
};
map<int, node> ma;
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 0; i <= n - 1; i++)
    {
        scanf("%d%d", &up[i], &down[i]);
        for (int j = 0; j <= m; j++)
            dp[i + 1][j] = INF;
    }
    for (int i = 1; i <= k; i++)
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        ma[a] = {b, c};
        vis[a] = 1;
    }
    for (int i = 1; i <= n; i++)
    {
        int a = 0;
        int b = m + 1;
        if (vis[i])
        {
            sum++;
            a = ma[i].back;
            b = ma[i].top;
        }
        for (int j = 1; j <= m; j++)
        {
            if (!(j > a && j < b))
                continue;
            int c = 0;
            int d = m + 1;
            if (vis[i - 1])
            {
                c = ma[i - 1].back;
                d = ma[i - 1].top;
            }
            if (j + down[i - 1] < d && j + down[i - 1] > c)
                dp[i][j] = min(dp[i][j], dp[i - 1][j + down[i - 1]]);
            if (j == m)
            {
                for (int k = 0; k <= m; k++)
                    if (j - k < d && j - k > c)
                    {
                        int q = k % up[i - 1];
                        int u = k / up[i - 1];
                        if (!q)
                        {
                            dp[i][j] = min(dp[i][j], dp[i - 1][j - k] + (k == 0 ? 1 : u));
                        }
                        else
                            dp[i][j] = min(dp[i][j], dp[i - 1][j - k] + k / up[i - 1] + 1);
                    }
            }
            else
            {
                if (j - up[i - 1] < d && j - up[i - 1] > c && j - up[i - 1] < b && j - up[i - 1] > a && dp[i - 1][j - up[i - 1]] != INF && dp[i][j - up[i - 1]] != INF)
                    dp[i][j] = min(dp[i][j], min(dp[i - 1][j - up[i - 1]], dp[i][j - up[i - 1]]) + 1);
                else
                    for (int k = 1; k <= m / up[i - 1]; k++)
                        if (j - up[i - 1] * k < d && j - up[i - 1] * k > c)
                            dp[i][j] = min(dp[i][j], dp[i - 1][j - up[i - 1] * k] + k);
            }
        }
        bool qw = true;
        for (int j = a + 1; j <= b - 1; j++)
        {
            if (dp[i][j] != INF)
            {
                qw = false;
                break;
            }
        }
        if (qw)
        {
            cout << "0" << endl;
            cout << sum - 1 << endl;
            return 0;
        }
    }
    int ans = INF;
    cout << "1" << endl;
    for (int j = 1; j <= m; j++)
        ans = min(ans, dp[n][j]);
    printf("%d", ans);
    return 0;
}
2024/8/1 16:17
加载中...