XYNUOJ 1454 数字三角形(递归和递推两种方法)

23人阅读 评论(2) 收藏 举报
分类:

1454: 数字三角形

时间限制: 1 Sec  内存限制: 128 MB
提交: 15  解决: 8
您该题的状态:已完成
[提交][状态][讨论版]

题目描述

数字三角形,从三角形顶部往下走,只能往左下或右下走,求走到最下面时所经过的数字和最大为多少?(下图为n=6时的情况)


     2     
    96 30    
   83 52 60   
  21 65 44 61  
 8 79 50 41 21 
61 41 50 38 79 10

输入

第1行:整数n(1<=n<=1000)

第2-n+1行:每行若干整数,第i行有i-1个整数空格分隔。

输出

一行:一个整数,表示所经过数字的最大和。

样例输入

6					
2					
96	30				
83	52	60			
21	65	44	61		
8	79	50	41	21	
61	41	50	38	79	10

样例输出

375

AC代码:

递归算法:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n;
int a[1005][1005];
int dp[1005][1005];//dp[i][j]表示从点(i,j)出发能走过的最大和 
int getdp(int i,int j)//计算dp[i][j] 
{
	if(dp[i][j]!=-1) return dp[i][j];//如果已经处理过就直接返回值,剪枝
    return dp[i][j]=a[i][j]+(i==n?0:max(getdp(i+1,j),getdp(i+1,j+1))); //i=n时就到最后一层了,递归开始回溯 
}
int main()
{
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  for(int j=1;j<=i;j++)
  scanf("%d",&a[i][j]),dp[i][j]=-1;//赋初值-1的目的:getdp(i,j)的时候通过看dp[i][j]是否不等于-1可得知它是否被处理过,剪枝 
  printf("%d\n",getdp(1,1));//最终求从点(1,1)出发到最后一层经过的最大和 
  return 0;
}

递推算法(逆序枚举):

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n;
int a[1005][1005];
int dp[1005][1005];//dp[i][j]表示从点(i,j)出发能走过的最大和 
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=i;j++)
	scanf("%d",&a[i][j]),dp[i][j]=0,dp[n][j]=a[n][j];//初始最大值都是0,最后一行最大值是自身 
	for(int i=n-1;i>=1;i--)//从倒数第二行第一个数开始赋值 
	for(int j=1;j<=i;j++)
	dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
	printf("%d\n",dp[1][1]);//最终求从点(1,1)出发到最后一层经过的最大和 
	return 0;
}

查看评论

数字三角形——递归、递推、记忆化搜索

数字三角形 描述:          有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外没个数的左下方          和右下方各有一个数。 问题:              从第...
  • user_longling
  • user_longling
  • 2014-05-16 21:42:20
  • 1444

递归与递推实现斐波那契数列算法

  • Limitless1113
  • Limitless1113
  • 2015-06-27 15:18:04
  • 642

递推 数字三角形

/* input: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 output: 30 数字三角形,可以说是一道很经典的题了,这道题应该出现在dp的入门题里, 但是在...
  • wikioi_bai
  • wikioi_bai
  • 2014-11-25 20:37:50
  • 608

蓝桥杯 算法训练 数字三角形 (递推)

算法训练 数字三角形   时间限制:1.0s   内存限制:256.0MB      问题描述   (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某...
  • Strokess
  • Strokess
  • 2016-03-10 20:29:37
  • 958

递归递推之计算组合数

题目大概: 按题目给出的公式求组合数。 思路: 用递归函数,递归求解组合数。 感想: 一般有公式的题大部分要用递归。 代码: #include using namespace s...
  • a1046765624
  • a1046765624
  • 2017-03-25 10:08:41
  • 366

斐波那契数列 递推 递归 备忘录 动态规划

当n=0时,f(n) = 0      当n=1时,f(n) = 1 当n>1时,f(n) = f(n-1) + f(n-2) 递归算法: [cpp...
  • judyge
  • judyge
  • 2015-04-17 11:21:33
  • 1112

动态规划——数字三角形(递归or递推or记忆化搜索)

1、题目大意: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,如图         1       3  2     4  10  1    4  3...
  • sdjzping
  • sdjzping
  • 2013-08-02 19:16:30
  • 3354

递归与递推的区别

刚才在IBM DW上看到这篇《JavaScript 技巧与高级特性》,其中关于arguments.callee的部分有一个用递归来求斐波那契数列的例子,简化一下是这样的: //经典递归 functio...
  • kanglongba
  • kanglongba
  • 2013-09-03 18:06:30
  • 3017

递推递归-F-计算组合数

题目: Description 计算组合数。C(n,m),表示从n个数中选择m个的组合数。 计算公式如下: 若:m=0,C(n,m)=1 否则, 若 n=1,C(n,m)=1...
  • sdausmj
  • sdausmj
  • 2017-04-09 18:52:32
  • 73

Fibonacci的两种实现方式:递归和递推

// 递归实现方式 public static int fibonacci(int n){ if(n
  • shymi1991
  • shymi1991
  • 2014-07-17 20:01:23
  • 1285
    个人资料
    持之以恒
    等级:
    访问量: 914
    积分: 676
    排名: 7万+
    文章存档
    最新评论