优化以下代码,使内存在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 浏览: 65
可以使用滚动数组进行优化,将二维数组f[n][m]转化为f[2][m],每次只保留i和i-1的状态。同时,可以将time数组改为二维数组time[MAXK][MAXN],这样在计算f[i][j]时可以直接使用time[x][i],避免了内存的不必要占用。
另外,由于题目中规定m<=10000,因此可以将f数组的第二维缩小为10001,只保留必要的状态。
优化后的代码如下:
相关问题
#include<math.h> #include<algorithm> #include<time.h> #include<stdlib.h> #include<iostream> #include<string.h> #include<map> #include<list> #include<string> #include<queue> #include<set> #include<vector> #include<stack> #include<limits> #define re register #define iosgo() std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define run(i,n) for (int i = 1; i <= n; i++) #define cin std::cin #define cout std::cout #define ll long long #define endl "\n" using namespace std; typedef pair<int, int>pll; const int N = 2e6 + 10; pll c[N]; int h[150][150]; int x[N], y[N], dp[N], ss[N]; int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } signed main() { string a; cin >> a; string b; cin >> b; if (a[0] == '0' || b[0] == '0') { cout << "0\n"; return 0; } int lena = a.length(); int lenb = b.length(); for (int i = 0; i < lena; i++) { x[i] = a[i] - '0'; } for (int i = 0; i < lenb; i++) { y[i] = b[i] - '0'; } int len = lena + lenb - 1; int r = 0; while (r < lenb) { for (int i = r, j = 0; i < lena + r; i++, j++) { ss[i] += x[j] * y[r]; } r++; } for (int i = len; i > 0; i--) { if (ss[i] >= 10) { ss[i - 1] += ss[i] / 10; ss[i] %= 10; } } for (int i = 0; i < len; i++) { cout << ss[i]; } }
这段代码是一个实现两个大整数相乘的程序。代码首先读取两个大整数a和b,然后将其转换为整型数组x和y。接下来,代码计算两个整数的乘积,并将结果存储在数组ss中。最后,代码将结果输出。
注意,这段代码没有考虑负数的情况,且对于较大的整数可能会导致溢出。如果需要处理更大的整数,可以考虑使用其他大数库或算法来实现。
``` #include<stdio.h> int main(void) { char str [100]; scanf_s("%99s", str); printf("%s", str); return 0; }```当输入内容时,程序崩溃了
这段C语言代码尝试通过`scanf_s`函数从用户那里读取最多99个字符到`str`数组中,然后打印这个字符串。然而,存在两个潜在问题可能导致程序崩溃:
1. **内存溢出**:`scanf_s` 函数在读入字符串前没有检查剩余空间。如果用户输入超过99个字符(包括空格),`str`数组可能会越界,从而覆盖其他未初始化的数据,引发运行时错误。
2. **宽字符函数**:`scanf_s` 是Windows平台特定的宽字符版本,如果你在非Windows系统上运行这段代码,它可能不会正常工作。对于标准版的`scanf`,你需要使用`scanf`而非`scanf_s`。
为了避免崩溃,你可以做以下修改:
1. **动态分配内存**:使用`fgets`代替`scanf`,可以指定包含终止符`\n`在内的最大字符数,如`fgets(str, sizeof(str), stdin)`。
2. **检查输入长度**:在接收输入后,检查实际读取的字符数是否在范围内。
修复后的代码可能像这样:
```c
#include<stdio.h>
#define MAX_LEN 100
int main(void)
{
char str[MAX_LEN];
size_t len;
// fgets allows for newline character and limits input to MAX_LEN - 1
if (fgets(str, MAX_LEN, stdin)) {
str[strlen(str) - 1] = '\0'; // Remove the newline if present
len = strlen(str); // Get the actual length of the string
if (len <= MAX_LEN - 1) { // Check if not overflowed
printf("%s", str);
} else {
printf("Input too long!\n");
}
}
return 0;
}
```
阅读全文