The Triangle——动态规划二维dp数组的两种不同解法

问题描述:
7
3   8
8   1   0
2   7   4   4
4   5   2   6   5

这是一个数字三角阵的例子。你将从顶部(7)开始,每次选择向左下或右下走一格直到阵底。请写一个程序,计算从阵顶到阵底的一条路中,经过的数字(包括头尾)总和的最大值。

输入:

第一行为1<n<101,表示三角阵的行数
从下一行起输入三角阵,每个节点的值都是0~99的整数。

输出

一个整数,表示和的最大值。

样例输入:

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

样例输出:

30

分析:

方法一:

顺序分析,f[i][j]可以选择两种状态相加-->f[i+1][j]或者f[i+1][j+1]

f[i][j]表示:到达这个位置之后的数,加上f[i][j]这个位置的数,加在一起最大和。

#include<stdio.h>
int max(int x,int y){
	if(x>y)
	return x;
	else 
	return y;
}
int main()
{
	int i,j;
	int n;
	int f[110][110];
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++)
			scanf("%d",&f[i][j]);
	}
	for(i=n-1;i>=1;i--){
		for(j=1;j<=i;j++){
			f[i][j]+=max(f[i+1][j],f[i+1][j+1]);
		}
	}
	printf("%d",f[1][1]);
	return 0; 
 }

方法二:

倒推,由此可知,f[i][i]可由f[i-1][j]或者f[i-1][j-1]这两条路径中的某一条(数值最大的那条)得到。

f[i][j]表示:到达这个位置之前的数,加上f[i][j]这个位置的数,加在一起最大和。

#include<stdio.h>
int max(int x,int y){
	if(x>y)
	return x;
	else 
	return y;
}
int main()
{
	int i,j;
	int n,maxs;
	int arr[110][110];
	int f[110][110]={0};
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++)
			scanf("%d",&arr[i][j]);
	}
	f[1][1]=arr[1][1];
	for(i=2;i<=n;i++)
        for(j=1;j<=i;j++)
            f[i][j]=arr[i][j]+max(f[i-1][j-1],f[i-1][j]);
    maxs=0;
	for(i=1;i<=n;i++){
    	maxs=max(f[n][i],maxs);
	}
	printf("%d",maxs);
	return 0; 
 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Is_Qinna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值