我是靠谱客的博主 神勇小懒猪,这篇文章主要介绍暑假编程训练_数塔取数,现在分享给大家,希望可以做个参考。

数塔取数

这是一道入门的动态规划题, 没做过的可能很难想出, 但是做过的会觉得很简单.

这道题相比最基础的数塔取数多了一个求路径. 只要记录所继承的下一层数的下标. 最后从头开始走过这些下标就是路径了.

时间复杂度是O(n), n为数塔的数的个数.

复制代码
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
57
58
59
60
61
62
63
#include <iostream> #include <cstring> using namespace std; const int maxn = 1005; int n, sum[maxn][maxn]; struct T { int x, y; } arr[maxn][maxn]; int main() { memset(sum, 0, sizeof(sum)); cin >> n; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= i; ++j) { cin >> arr[i][j].x; } } for (int i = 1; i <= n; ++i) { arr[n][i].y = i; sum[n][i] = arr[n][i].x; } for (int i = n - 1; i >= 1; --i) { for (int j = 1; j <= i; ++j) { if (sum[i + 1][j] > sum[i + 1][j + 1]) { sum[i][j] = sum[i + 1][j] + arr[i][j].x; arr[i][j].y = j; } else { sum[i][j] = sum[i + 1][j + 1] + arr[i][j].x; arr[i][j].y = j + 1; } } } /*for (int i = 1; i <= n; ++i) { for (int j = 1; j <= i; ++j) { cout << sum[i][j] << ' '; } cout << endl; }*/ cout << sum[1][1] << 'n'; int k = 1, next = 1; while (k <= n) { cout << arr[k][next].x << ' '; next = arr[k++][next].y; } cout << endl; } /* 5 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 */

最后

以上就是神勇小懒猪最近收集整理的关于暑假编程训练_数塔取数的全部内容,更多相关暑假编程训练_数塔取数内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(177)

评论列表共有 0 条评论

立即
投稿
返回
顶部