y总代码里用一维状态数组, 计算每天的最大价值时, 用到的优化是
- 如果一个纪念品第二天的价格低于当天的, 这次计算就跳过他.
但是用二维状态f[N][M]表示时, 如果也用 if (w[k + 1][i] > w[k][i])
来优化的话, f[n][m]就无法通过上一个状态转移过来, 最后的答案就是错的了.
所以二维写法不能优化, 用时$2100ms$, 一维带优化只有$750ms$
请各位大佬指点指点.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int T = 110, N = 110, M = 10010;
int t, n, m;
int w[T][N];
int f[N][M];
int main() {
cin >> t >> n >> m;
for (int i = 1; i <= t; i++) {
for (int j = 1; j <= n; j++) {
cin >> w[i][j];
}
}
for (int k = 1; k < t; k++) {
memset(f, 0, sizeof f);
int res = 0;
for (int i = 1; i <= n; i++) {
if (1 || w[k + 1][i] > w[k][i]) { // 这里不能加这一条优化
for (int j = 1; j <= m; j++) {
f[i][j] = f[i - 1][j];
if (j >= w[k][i])
f[i][j] = max(f[i][j], f[i][j - w[k][i]] + w[k + 1][i] - w[k][i]);
}
}
}
m += f[n][m];
}
cout << m << endl;
return 0;
}