这个作业有点多,尽量一点点地每一道题都写得详细一点吧。
A. 数字三角形 Number Triangles
传送门:水滴
题目大意:给你一个由正整数组成的三角形,让你选择一条路径,是这条路径的权值和最大。
首先拿到题考虑贪心,但是贪心的做法局限性很大,样例都过不了,否掉。
考虑 $dp$,发现逆向求解更优,于是观察样例:由每一行往上转移,每次取最大的,最后三角形顶就是答案。
点击查看代码
#include <bits/stdc++.h>
#define ll long longusing namespace std;const int maxn = 1e4 + 10;int r;
int f[maxn][maxn];int main() {scanf("%d", &r);for (int i = 1; i <= r; i++) {for (int j = 1; j <= i; j++) {scanf("%d", &f[i][j]);}}for (int i = r - 1; i >= 1; i--) {for (int j = 1; j <= i; j++) {f[i][j] += max(f[i + 1][j + 1], f[i + 1][j]);}}return printf("%d", f[1][1]), 0;
}