0%

一个调试的好方法

调试大法---- printf !! !!

比如说,我们有这么一个代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m, a[N][N];
long long dp[N][N][3]; // dp[i][j][0/1/2] 表示 从 (1, 1) 走到 (i, j), 且是从上面/左边/下面来的

long long dfs(int i, int j, int k)
{
if (i < 1 || i > n || j < 1 || j > m) return dp[0][0][0];
if (i == 1 && j == 1)
return dp[i][j][k] = a[i][j];
if (dp[i][j][k] != dp[0][0][0])
return dp[i][j][k];

if (k == 0)
return dp[i][j][k] = max(dfs(i - 1, j, 0), dfs(i - 1, j, 1)) + a[i][j];

else if (k == 1)
return dp[i][j][k] = max(dfs(i, j - 1, 0), max(dfs(i, j - 1, 1), dfs(i, j - 1, 2))) + a[i][j];

else if (k == 2)
return dp[i][j][k] = max(dfs(i + 1, j, 1), dfs(i + 1, j, 2)) + a[i][j];

return dp[0][0][0];
}

int main(void)
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);

memset(dp, -0x3f, sizeof dp);
// dp[1][1][0] = a[1][1];
// dp[1][1][1] = a[1][1];
// dp[1][1][2] = a[1][1];

// for (int i = 1; i <= n; i++)
// for (int j = 1; j <= m; j++)
// for (int k = 0; k < 3; k++)
// {
// if (k == 0)
// dp[i][j][k] = max(dp[i - 1][j][0], dp[i - 1][j][1]) + a[i][j];
// else if (k == 1)
// dp[i][j][k] = max(dp[i][j - 1][0], max(dp[i][j - 1][1], dp[i][j - 1][2])) + a[i][j];
// else if (k == 2)
// dp[i][j][k] = max(dp[i + 1][j][1], dp[i + 1][j][2]) + a[i][j];
// }

// cout << max(dp[n][m][0], max(dp[n][m][1], dp[n][m][2]));

long long t = max(dfs(n, m, 0), max(dfs(n, m, 1), dfs(n, m, 2)));
cout << t;
}

它的唯一问题是, n, m被重复定义了

由于注释太多,可能不太好发现
但我们只要在最后printf一下dp数组…

1
2
3
4
5
6
7
for(int k = 0; k < 3; k++)
{
printf("\n\nk = %d version\n\n", k);
for(int i = 1; i <= n; i++, putchar('\n'))
for(int j = 1; j <= m; j++)
printf("%14d ", dp[i][j][k]);
}

就会发现输出全是inf. 为什么呢?
我们在dfs之前调试,发现所有的dfs都在dfs函数的第一行直接返回了
于是我们发现了问题…

欢迎关注我的其它发布渠道