求助20分
查看原帖
求助20分
639942
zero_re楼主2023/5/23 11:42

dp的思路,感觉和题解差不多,只是我是从高向低的

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#define ll long long
#define N 5010
using namespace std;
int n, h, delta;
int nums[N];
int counts[N][N], dp[N][N];
int main() {
    scanf("%d%d%d", &n, &h, &delta);
    for (int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);
        for (int j = 0; j < nums[i]; j++) {
            int pos;
            scanf("%d", &pos);
            counts[pos][i]++;
        }
    }
    for (int i = h; i>= 0; i--) {
        int Max = 0;
        if (i <= h - 2) {
            for (int j = 0; j < n; j++) {
                Max = max(Max, dp[i+2][j]);
            }
        }
        for (int j = 0; j < n; j++) {
             dp[i][j] = max(Max, dp[i+1][j]) + counts[i][j];
        }
    }
    int ans = 0;
    for (int j = 0; j < n; j++) {
        ans = max(ans, dp[0][j]);
    }
    printf("%d\n", ans);
}

2023/5/23 11:42
加载中...