SCU - 1114 数字三角

下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。

7

3  8

8  1  0

2  7  4  4

1.  每一步可沿左斜线向下或右斜线向下走;

2.  1<=三角形行数<=100

3.  三角形中的数字为整数 0,1,……,99。

4.  如果有多种情况结果都最大,任意输出一种即可。

输入:

第一行一个整数N,代表三角形的行数。

接下来N行,描述了一个数字三角。

输出:

第一行一个整数,代表路径所经过底数字总和。

第二行N个数,代表所经过的数字。

样例:

输入:

4
7
3 8
8 1 0
2 7 4 4

输出:

25
7 3 8 7

递推式:

f[i][j]=max(f[i+1][j],f[i+1][j+1])+c[i][j];

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4
 5 using namespace std;
 6
 7 int c[105][105],f[105][105];
 8
 9 int n;
10
11 void find(int a,int b)
12 {
13     if(a>n)
14         return ;
15     printf("%d ",c[a][b]);
16     if(f[a+1][b]>f[a+1][b+1])
17         find(a+1,b);
18         else
19             find(a+1,b+1);
20     return ;
21 }
22
23 int main()
24 {
25     scanf("%d",&n);
26     for(int i=1;i<=n;i++)
27         for(int j=1;j<=i;j++)
28             scanf("%d",&c[i][j]);
29     for(int i=1;i<=n;i++)
30         f[n][i]=c[n][i];
31     for(int i=n-1;i>0;i--)
32         for(int j=1;j<=i;j++)
33             f[i][j]=(max(f[i+1][j],f[i+1][j+1])+c[i][j]);
34     printf("%d\n",f[1][1]);
35     find(1,1);
36
37
38     return 0;
39 } 
时间: 2024-10-07 06:16:57

SCU - 1114 数字三角的相关文章

数字三角——递归、递归、内存搜索

数字三角 叙述性说明: 有一个非负整数三角,第一行中只有一个号码,的左下方和右下方各有一个数. 问题: 从第一行的数開始.每次能够往左下或右下走一格.直到走到最下行,把沿途经过的数所有加起来. 怎样走才干使得这个和尽量大? 分析: 不难看出此题是一个动态的决策问题:每次有两种选择--左下或右下. 假设用回溯法求出全部的可能的路线,就能够从中选出最优的路线.但和往常一样,回溯法的效率太低:一个n层数字三角形的完整路线有2^n条.当n非常大时回溯法的速度将让人无法忍受.因此本题讨论用递归,递推及记忆

SCU 1114(DP初步_A题)解题报告

题目链接:http://acm.scu.edu.cn/soj/problem.action?id=1114 --------------------------------------------------------------------------------- 题意:一个三角形,只能向下或向右下走,要求得到最大值的路线. 思路:从底向上,状态转移方程为f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]. 代码: #include<cstdio> #i

由数字三角问题来理解DP

先看几类数字三角形的问题,通过对这几个问题的分析来理解有关动态规划的基本思想 数字三角形I 问题描述: 有一个由正整数组成的三角形,第一行只有一个数,除了最下行之外 每个数的左下方和右下方各有一个数,从第一行的数开始,每次可以往左下或右下走一格,直到走到三角形底端,把沿途经过的数全部加起来作为得分.如何走,使得这个得分尽量大? 分析: 如何走,是一个决策问题,很容易联想到一种贪心策略是:每次选数字大的那个方向走.然而很明显,这种决策方案是错误的.因为如果按这种方案,得到的结果是1→3→10→3,

HDU1176:免费馅饼(dp,数字三角形的应用)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1176 这题就是数字三角行的变形,可惜对于我这个渣渣来说就是没发现,区别是他可以保持在三个点,他左边的点,右边的点,还有原点, 从下往上处理.其他就没有什么好说的了,注意一下细节问题,我记得这题我白白贡献了几次WA. #include <iostream> #include <stdio.h> #include <string.h> #include <math.h>

数字三角形 17 初入dp

Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和. 注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数. Input 输入数据有多组,每组输入的是一行是一个整数N (1 < N <= 100),给出三角形的行数.下面的N行给出数字三角形.数字三角形上的数的范围都在0和100之间. Output

POJ 2760: 数字三角形

import java.util.Scanner; public class Main { public static void main(String[] args) { int[][] triNumbers = new int[101][101];//0-100内 int[][] triMaxs = new int[101][101]; Scanner in = new Scanner(System.in); int nrow = in.nextInt();//行数 for(int i=0;

动态规划习题:数字三角形

问题描述    7  3   8  8    1    0         2     7    4    4      4    5    2    6     5 上图给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径.你的任务就是求出最佳路径上的数字之和.注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数. 输入数据输入的第一行是一个整数 N (1 < N <= 100),给出三

算法第三章上机实践报告之数字三角形

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6

值得一做》关于数学与递推 BZOJ1002 (BZOJ第一页计划)(normal+)

什么都不说先甩题目 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒   Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 S