朴素 n ^ 3 WA 30 求条
查看原帖
朴素 n ^ 3 WA 30 求条
1113126
Statax楼主2025/1/16 19:42

我知道会 TLE,但是没想到一直 WA(已红温…

提交记录,跪求大佬

#include <bits/stdc++.h>
#define int long long
#define lowbit (x) x & (-x)

using namespace std;
const int MAXN = 2e3 + 5;
const int INF = 0x3f3f3f3f;

int n, m, d, ans;
int ap[MAXN], bp[MAXN], as[MAXN], bs[MAXN];
int f[MAXN][MAXN]; // f[i][j] 前 i 天,共有 j 个股票

void init () {
	memset (f, -INF, sizeof f);
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= as[i]; ++j)
			f[i][j] = -ap[i] * j;
	}	
}

signed main () {
	cin >> n >> m >> d;
	for (int i = 1; i <= n; ++i) 
		cin >> ap[i] >> bp[i] >> as[i] >> bs[i];
	init ();
	for (int i = d + 2; i <= n; ++i) { // 枚举当前是第 i 天。
		for (int j = 0; j <= m; ++j) { // 枚举共有 j 股股票。
			int x = -INF, y = -INF;
			// 买入
			for (int k = j - as[i]; k < j; ++k) 
				x = max (x, f[i - d - 1][k] + ap[i] * k) - ap[i] * j;
			// 卖出
			for (int k = bs[i] + j; k > j; --k) 
				y = max (y, f[i - d - 1][k] + bp[i] * k) - bp[i] * j;
			f[i][j] = max({x, y, f[i - 1][j]}); 
		}
	} for (int i = 0; i <= as[n]; ++i) ans = max (ans, f[n][i]);
	cout << ans << endl;
	return 0;
} 

2025/1/16 19:42
加载中...