#include <stdio.h>
#include <stdlib.h>
#define N 310
int min(int a, int b)
{
if(a<b)
return a;
return b;
}
int max(int a, int b)
{
if(a<b)
return b;
return a;
}
int main()
{
FILE *file;
int n, i, j, k;
int a[2*N+1], s[2*N+1];
int f[2*N+1][2*N+1], d[2*N+1][2*N+1];
printf("1");
file = fopen("E:\\算法\\第3章动态规划实验\\prog33石子合并问题\\test\\merge1.in", "r");
if (file == NULL)
{
perror("Error opening file");
return 0;
}
fscanf(file, "%d", &n);
printf("%d\n", n);
for (i = 1; i <= n; i++)
{
fscanf(file, "%d", &a[i]);
printf("%d ", a[i]);
}
printf("\n");
for (i = n + 1; i <= 2 * n; i++)
{
a[i] = a[i - n];
}
for (i = 1; i <= 2 * n; i++)
{
s[i] = s[i - 1] + a[i];
}
fclose(file);
// 初始化数组 f
for (i = 1; i <= 2 * n; i++)
{
for (j = 1; j <= 2 * n; j++)
{
f[i][j] = 0x3f3f3f3f;
}
}
// 初始化数组 d
for (i = 1; i <= 2 * n; i++)
{
for (j = 1; j <= 2 * n; j++)
{
d[i][j] = 0;
}
}
for (i = 1; i <= 2 * n; i++)
{
f[i][i] = 0;
}
// 枚举区间长度
for (int len = 2; len <= n; len++)
{
// 枚举区间起点
for (i = 1; i + len - 1 <= 2 * n; i++)
{
int j = i + len - 1;
for (k = i; k < j; k++)
{
f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + s[j] - s[i - 1]);
d[i][j] = max(d[i][j], d[i][k] + d[k + 1][j] + s[j] - s[i - 1]);
}
}
}
printf("%d\n", f[1][n]);
printf("%d\n", d[1][n]);
file = fopen("E:\\算法\\第3章动态规划实验\\prog33石子合并问题\\answer\\merge1.out", "r");
if (file == NULL)
{
perror("Error opening file");
return -1;
}
int h[2] = {0};
for (i = 0; i < 2; i++)
{
fscanf(file, "%d", &h[i]);
}
fclose(file);
if (h[0] == f[1][n] && h[1] == d[1][n])
{
printf("检测成功\n");
}
else
{
printf("检测不符\n");
}
return 0;
}
这是石子合并问题为什么在codeblocks上没有报错,但是一运行就直接结束了,也没有任何输出,在主函数的第一条代码加上printf语句输出也没有任何打印输出。