$$ 动态规划 \begin {cases} 状态表示 f(i, j) \begin {cases} 集合:所有从起点走到(i, j)的路径\\\ 属性:路径数字和最大 \end{cases}\\\ \\\ 状态计算 \begin {cases} 分类 \begin {cases} 从左上方到达(i, j) & f(i-1, j-1) + a(i, j)\\\ 从右上方到达(i, j) & f(i-1, j) + a(i, j)\\\ \end {cases} \\\ \\\ 求解:两种可能求max \end{cases}\\\ \end {cases} $$
#include <iostream>
#include <cstring>
using namespace std;
const int N = 510, INF = 1e9;
int a[N][N], f[N][N];
int n;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= i; j ++)
scanf("%d", &a[i][j]);
memset(f, 0x8f, sizeof f); // 初始化为负无穷
f[1][1] = a[1][1];
for (int i = 2; i <= n; i ++)
for (int j = 1; j <= i; j ++)
f[i][j] = max(f[i-1][j-1], f[i-1][j]) + a[i][j];
int res = -INF;
for (int j = 1; j <= n; j ++)
res = max(res, f[n][j]);
printf("%d\n", res);
return 0;
}
为啥INF为1e9的时候, memset(f, -INF, sizeof f),就WA呢,INF为0x3f3f3f3f的时候就过了
因为
memset(f, 0x8f, sizeof f)
是将f
的每一个字节设置为0x8f
,而不是每一个元素。当第二个参数大于一个字节的最大值时,按照某种方式截断,所以1e9
就 WA 了hhh动态规划⎧⎩⎨⎪⎪⎪⎪⎪⎪状态表示f(i,j){集合:所有从起点走到(i,j)的路径属性:路径数字和最大状态计算⎧⎩⎨⎪⎪分类{从左上方到达(i,j)从右上方到达(i,j)f(i−1,j−1)+a(i,j)f(i−1,j)+a(i,j)求解:两种可能求max
wo我这里为什么是错误的啊,
右上方是
dp[i-1][j] + a[i][j]
,二维数组顺序和直角坐标系不大一样hh嗷嗷,懂了