1625 数字金字塔

1625 数字金字塔

链接:http://codevs.cn/problem/1625/

USACO

时间限制: 1 s

空间限制: 128000 KB

题目描述 Description

考虑在下面被显示的数字金字塔.

写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大.

每一步可以走到下方的点也可以到达右下方的点.

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

在上面的样例中,从 7 到 3 到 8 到 7 到 5 的路径产生了最大和:30

输入描述 Input Description

第一个行包含 R(1<= R<=1000) ,表示行的数目.

后面每行为这个数字金字塔特定行包含的整数.

所有的被供应的整数是非负的且不大于 100

输出描述 Output Description

单独的一行包含那个可能得到的最大的和.

样例输入 Sample Input

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

样例输出 Sample Output

30

数据范围及提示 Data Size & Hint

题解:h[i][j]存该点数值, f[i][j]存从底部到该点的最大和,为该点值+Max(该点正下方最大和,该点斜下方最大和),即

f[i][j]=max(f[i+1][j]+h[i][j],f[i+1][j+1]+h[i][j]);
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int h[1005][1005],f[1005][1005];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
            scanf("%d",&h[i][j]);
    for(int j=1;j<=n;j++)f[n][j]=h[n][j];
    int i=n;
    while(i>1){
        i--;
        for(int j=1;j<=i;j++)
            f[i][j]=max(f[i+1][j]+h[i][j],f[i+1][j+1]+h[i][j]);

    }

    cout<<f[1][1]<<endl;
}
时间: 2024-10-26 05:43:16

1625 数字金字塔的相关文章

1.5.1 Number Triangles 数字金字塔

★1.5.1 Number Triangles 数字金字塔 一.题目描述 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30 PROGRAM NAME: numtri 18 INPUT FORMAT 第一个行包含 R(1<= R<=1000) ,表示行的数目

数字金字塔最大路径和——递归

题目描述 假设有如下所示的一个数字金字塔,现在,要求写一个程序来查找从顶点到底部任意处结束的路径,使路径经过的数字的和最大,并输出该路径的最大和.比如以下金字塔的和最大路径的和为7+3+8+7+5=30.7 3 2 8 1 0 2 7 4 4 4 5 2 6 5 C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152   #include <i

【动态规划基础】数字金字塔

题目链接:1258:[例9.2]数字金字塔 1258:[例9.2]数字金字塔 时间限制: 1000 ms         内存限制: 65536 KB提交数: 9635     通过数: 5467 [题目描述] 观察下面的数字金字塔.写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以从当前点走到左下方的点也可以到达右下方的点. 在上面的样例中,从13到8到26到15到24的路径产生了最大的和86. [输入] 第一个行包含R(1≤ R≤1000),表示行的数目. 后面

Python输出数字金字塔

使用Python输出一个数字金字塔 运行结果: 源代码: ''' Python输出数字金字塔 ''' for x in range(1,10): print(' '*(15-x),end='') n=x while n>=1: print(n,sep='',end='') n-=1 n+=2 while n<=x: print(n,sep='',end='') n+=1 print() 原文地址:https://www.cnblogs.com/yijiahao/p/11740372.html

shell脚本编程设计——根据输入的数输出菱形、三角形或者数字金字塔(带闪烁颜色)

shell脚本编程设计--根据输入的数输出菱形.三角形或者数字金字塔(带闪烁颜色) shell脚本程序和解释如下 #!/bin/bash #创建死循环,当输入出错或者输入"quit"字符串退出脚本程序 while true do #等待用户输入 read -p "请输入一个不大于20的正整数(输入"quit"则退出):" n #先判断字符串是否是quit if [ "$n" == "quit" ] then

习题7 数字金字塔

输入任意数字X(例:6),输出如下图形 首先使用两层for循环,一层循环行数,一层循环列数 如题,在列中,不仅要输出"*",还要输出空格,所以在第一层for循环中,应使用两个并列的for循环 import java.util.Scanner; public class Jinzita { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int x=scanner.nextI

练习5-3 数字金字塔(15 分)

输入样例: 5 输出样例: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 #include<stdio.h> int sum(int n) { for(int i=1;i<=n;i++)//n行 { for(int j=0;j<n-i;j++)//左边空格数 { printf(" "); } for(int j=1;j<=i;j++)//输出数字,数字后有一个空格 { printf("%d ",i); } printf(&

输出数字金字塔代码

#include <iostream> using namespace std; void main() { int i,n; cout<<"请输入共几层\n"; cin>>n; for (i=1;i<=n;i++) { for(int j=0;j<n-i;j++) cout<<"  "; for (int k=0;k<2*i-1;k++) { if (k<i) { printf("%

数字金字塔解题报告

用二维数组记录数,每一个数a[i][k]对应的下两个数是a[i+1][k]和a[i+1][k+1]队列数组也可以 记忆化搜索 从下往上讨论DP==从下往下讨论 DP, f[i][k]从塔顶到此处的最大路径引申滚动数组 1 #include <cstdio> 2 using namespace std; 3 #define maxr 1001 4 int a[maxr][maxr]; 5 bool f[maxr][maxr]; 6 int r; 7 int max(int a, int b) 8