感觉很巧妙的题呀。。 没想到转移的时候也需要一个dp, 就怎么算怎么感觉复杂度不对。。
dp[ i ][ s ] 表示 i 作为最底层的块, 它上面最多能放重量为 s 的最优值。
我们将包裹先按R小排, 再按L大排, 这样对于 i 这个包裹来说, 能放在它上面的都在它左边。
对于dp[ i ][ s ] 从哪里转移过来就是选一些能放在 i 上面的包裹 k , 并且a[ k ].w <= s, 还有就是选的包裹时间不能相交。
这个可以用一个dp去找到最优值。。。
还有就是可以把平台看成一个包裹就好处理一点。
#include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int> #define SZ(x) ((int)x.size()) #define ALL(x) (x).begin(), (x).end() #define fio ios::sync_with_stdio(false); cin.tie(0); using namespace std; const int N = 500 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-8; const double PI = acos(-1); template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;} template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;} template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;} template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;} int n, S; int f[N][N << 1]; int toL[N]; int g[N]; struct Node { int l, r, w, s, v; bool operator < (const Node& rhs) { if(r == rhs.r) return l > rhs.l; return r < rhs.r; } void read() { scanf("%d%d%d%d%d", &l, &r, &w, &s, &v); } void print() { printf("%d %d %d %d %d ", l, r, w, s, w); } }; Node a[N]; int main() { scanf("%d%d", &n, &S); n++; a[1] = Node{0, 2 * n + 1, 0, S, 0}; for(int i = 2; i <= n; i++) a[i].read(); sort(a + 1, a + 1 + n); for(int i = 2; i <= n; i++) { for(int j = i - 1; j >= 1; j--) { if(a[j].r <= a[i].l) { toL[i] = j; break; } } } for(int i = 1; i <= n; i++) { for(int j = 0; j <= a[i].s; j++) { memset(g, 0, sizeof(g)); for(int k = i - 1; k >= 0; k--) { chkmax(g[k], g[k + 1]); if(a[k].l >= a[i].l && a[k].r <= a[i].r && a[k].w <= j) { chkmax(g[toL[k]], g[k] + f[k][min(a[k].s, j - a[k].w)]); } } f[i][j] = g[0] + a[i].v; } } printf("%d ", f[n][S]); return 0; } /* */