题目链接:
https://www.luogu.com.cn/problem/P1216
思路:
1.若用二维数组来存储数字三角形,设
x
i
,
j
x_{i,j}
xi,j是从顶端走到第
i
i
i行第
j
j
j列时的最大和、
a
i
,
j
a_{i,j}
ai,j是存储数字三角形的二维数组对应位置的值,则可得
x
i
,
j
=
m
a
x
(
x
i
−
1
,
j
,
x
i
−
1
,
j
−
1
)
+
a
i
,
j
x_{i,j}=max(x_{i-1,j},x_{i-1,j-1})+a_{i,j}
xi,j=max(xi−1,j,xi−1,j−1)+ai,j
2.添加滚动数组,用一个一维数组实现以上功能;
代码:
#include <iostream>
using namespace std;
const int maxn = 1005;
int n, dp[maxn];
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
scanf("%d %d", &n, &dp[0]);
for(int i = 2; i <= n; ++i) {
for(int j = i - 1; j >= 0; --j) {
int x;
scanf("%d", &x);
dp[j] = max(dp[j], dp[j - 1]) + x;
}
}
int ans = 0;
for(int i = 0; i < n; ++i) ans = max(ans, dp[i]);
printf("%d", ans);
return 0;
}