4979 数塔 (动规)

4979 数塔

时间限制: 1 s

空间限制: 1000 KB

题目等级 : 黄金 Gold

题目描述 Description

有如图数塔,从顶部出发,在每一节点选择向左走或向右走,一直走到底。要求找到一个路径,使路径总和最大。

13

11       8

12       7      26

6      14      15      8

12      7      13      24     11

输入描述 Input Description

第一行输入一正整数n

接下来从第2行到第n+1行每行输入行数减1个正整数m。

输出描述 Output Description

共两行

第一行输出最大总和;

第二行输出最大路径,用‘-’隔开;

样例输入 Sample Input

5

13

11   8

12   7  26

6  14  15   8

12   7  13  24  11

样例输出 Sample Output

86

13-8-26-15-24

数据范围及提示 Data Size & Hint

40%数据:n<=20 , m<=1000

60%数据:n<=60 , m<=1050

 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 int n;
 5 int num[66][66];
 6 int f[66][66];
 7 int pre[66][66];
 8 int main()
 9 {
10     cin>>n;
11     for(int i=1;i<=n;++i)
12     {
13         for(int j=1;j<=i;++j)
14         {
15             scanf("%d",&num[i][j]);
16             if(i==n)f[i][j]=num[i][j];
17         }
18     }
19     for(int i=(n-1);i>=1;--i)
20     {
21         for(int j=1;j<=(i+1);++j)
22         {
23             if(f[i+1][j]>f[i+1][j+1])
24             {
25                 pre[i][j]=j;
26                 f[i][j]=f[i+1][j]+num[i][j];
27             }
28             else
29             {
30                 pre[i][j]=j+1;
31                 f[i][j]=f[i+1][j+1]+num[i][j];
32             }
33         }
34     }
35     cout<<f[1][1]<<endl<<num[1][1];
36     int k=1,h=1;
37     while(pre[k][h])
38     {
39         h=pre[k][h];
40         ++k;
41         cout<<"-"<<num[k][h];
42     }
43     return 0;
44 }
时间: 2024-12-11 07:38:05

4979 数塔 (动规)的相关文章

4979 数塔

4979 数塔 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有如图数塔,从顶部出发,在每一节点选择向左走或向右走,一直走到底.要求找到一个路径,使路径总和最大. 13 11       8 12       7      26 6      14      15      8 12      7      13      24     11 输入描述 Input Description 第一行输入一正整数n 接下来从第2

SDJZU_新生_递推动规_HDU 2084 数塔

数塔 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首

算法&lt;初级&gt; - 第五章 递归与动规相关问题(完结)

算法<初级> - 第五章 递归与动规相关问题(完结) <一>递归和动态规划 暴力递归 转化为规模缩小了的同问题的子问题 - 时间复杂度O(2n-1) 有明确的边界条件(base case) - 先写base case,再写问题递归的过程 有得到子问题结果后决策过程 不记录每个子问题的解 - 每次求解子问题都交给递归去解决,不会在全局保存子问题的解(与动规形成对比) 动态规划DP 从暴力递归中延申 - 过程中还经历过<记忆化搜索>,相当于暴力递归+cache缓存(用has

【字符串处理+动规】单词的划分

[字符串处理+动规]单词的划分 Time Limit: 1000MS Memory Limit: 2560KB 有一个很长的由小写字母组成字符串.为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词.出于减少分析量的目的,我们希望划分出的单词数越少越好.你就是来完成这一划分工作的. 输入格式 第一行,一个字符串.(字符串的长度不超过100)     第二行一个整数n,表示单词的个数.(n<=100)     第3~n+2行,每行列出一个单词. 输出格式     一个整数,

[bzoj4247][挂饰] (动规+排序)

Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上.直接挂在手机上的挂件最多有1个. 此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示.如果JOI君很讨厌某个挂饰,那么这个挂饰的喜悦值就是一个负数. JOI君想要最大化所有挂饰的喜悦值之和.注意不必要将所有的挂钩都挂上挂饰,而且一个都不挂也是可以的.

HDU 1160 FatMouse&#39;s Speed (动规+最长递减子序列)

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 4061 Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster

HDU 2844 Coins (动规)

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6904    Accepted Submission(s): 2809 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One

【noip 2009】 乌龟棋 记忆化搜索&amp;动规

题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前

动规讲解基础讲解一——01背包(模板)

作为动态规划的基础,01背包的思想在许多动规问题中会经常出现,so,熟练的掌握01背包的思路是极其重要的: 有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重为m的背包,我们选择一些物品放入背包,显然放入背包的总重量不超过m.我们要求选择物品的总价值最大,请问如何选择?这里我们假设所有出现的数都是正整数. 第一想法是? (1) 枚举?万能的枚举啊.但对于n件物品,每件都可以选择取或者不取,总的可能性有2n, n = 30就大约已经有10亿种可能了!枚举所