动态规划 简单题目集锦(一) UPC

题目

探索数字迷塔

题目描述
晶晶最近迷上了数字迷宫游戏,整天沉浸在一串串看似简单的数字中自得其乐。数字迷宫游戏的魅力体现在变化中隐含着不变的规律,归纳是探究数字迷宫的法宝之一。下图就是一个由线连接起来的数字小方格组成的数字迷塔。
在这里插入图片描述
这个迷塔共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])
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值