优化以下代码,使内存在64mb以内#include <stdio.h> #include <string.h> #include <limits.h> #define MAXN 2001 #define MAXK 2001 #define MAXM 10001 int n, k, m; int time[MAXN][MAXK]; int f[MAXN][MAXM]; int main() { scanf("%d%d%d", &n, &k, &m); for (int i = 1; i <= n; i++) { for (int j = 1; j <= k; j++) { scanf("%d", &time[i][j]); } } for (int i = 0; i <= n; i++) { for (int j = 1; j <= m; j++) { f[i][j] = 99999; } } f[0][0] = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { for (int x = 1; x <= k && x <= j; x++) { if (f[i-1][j-x] != 99999) { if (f[i][j] < f[i-1][j-x] + time[i][x]) f[i][j] = f[i][j]; else f[i][j] = f[i-1][j-x] + time[i][x]; } } } } printf("%d\n", f[n][m]); return 0; }
时间: 2024-01-23 18:01:47 浏览: 64
代码优化.有效使用内存
可以使用滚动数组进行优化,将二维数组f[n][m]转化为f[2][m],每次只保留i和i-1的状态。同时,可以将time数组改为二维数组time[MAXK][MAXN],这样在计算f[i][j]时可以直接使用time[x][i],避免了内存的不必要占用。
另外,由于题目中规定m<=10000,因此可以将f数组的第二维缩小为10001,只保留必要的状态。
优化后的代码如下:
阅读全文