题目
探索数字迷塔
题目描述
晶晶最近迷上了数字迷宫游戏,整天沉浸在一串串看似简单的数字中自得其乐。数字迷宫游戏的魅力体现在变化中隐含着不变的规律,归纳是探究数字迷宫的法宝之一。下图就是一个由线连接起来的数字小方格组成的数字迷塔。
这个迷塔共n层,它由n×(n+1)/2个小方格组成。每个小方格中都有一个数字,并且连着下一层的两个小方格。现从塔顶走到塔底,每一步只能走到相邻的方格中,则经过方格的数字之和最大值是多少?这个问题晶晶已经琢磨一天了,她感觉异常棘手。你能帮帮她吗?
输入
输入数据共n+1行,第1行是一个整数n(1≤n≤1000),表示数字迷塔的高度,接下来用n行数字表示数字迷塔,其中第i行有i个正整数,且所有的正整数均不大于100。
输出
输出可能得到的最大和。
样例输入
5
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
样例输出
59
提示
样例说明:9→12→10→18→10
AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[1010][1010];
int dp[1010];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
scanf("%d", &a[i][j]);
dp[j] = a[i][j]; //初始化第n层
}
}
for (int i = n - 1; i >= 1; i--) {
//从第n-1层往上
for (int j = 1; j <= i; j++) {
//dp[j]表示从第i层一直到第n层最大的数字之和 第i层的每一个都选它左下方和右下方的最大的,
dp[j] = max(dp[j] + a[i][j], dp[j + 1] + a[i][j]);//空间优化 用一维数组,每次更新后,之前的都用不到了
}
}
printf("%d\n", dp[1]);
return 0;
}
圣诞树
题目描述
圣诞特别礼物挂在一棵圣诞树上,这棵树有n层,每层有一件礼物,每件礼物都有一个价值,有的礼物还有一些连接线,与下层的礼物相连。领取礼物的规则如下:任选一件礼物,它的下面如果有连接线,则可以继续取它连接的礼物,依此类推直至取到没有连接线的礼物才结束。你如果是第一个去取,怎样取才能获得最大的价值呢?请你编一程序解决这一问题。
输入
第1行只有一个数据n(n≤100),表示有n层礼物,以下有n行数据,分别表示第1~n层礼物的状态,每行至少由一个数据构成,且第一个数据表示该礼物的价值,后面的数据表示它与哪些层的礼物相连,如果每行只有一个数据则说明这层礼物没有与下层礼物相连,每个数据大小均不超过10000。
输出
只有一个数,表示获得的最大价值。
样例输入
3
12 2 3
20
30
样例输出
42
AC代码
#include <bits/stdc++.h>
using namespace std;
struct node {
int val;
int l[102];
int c;
} a[110];
int dp[110];//dp[i]表示从i开始到最后所能获得的最大价值
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i].val);
int cnt = 0;
while (getchar() == ' ') {
scanf("%d", &a[i].l[++cnt])