数字三角形(动态规划问题-两种写法)

 数字三角形(OpenJ_Bailian 2760)

7
3   8
8   1   0
2   7   4   4
4   5   2   6   5

(图1)


图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。

Input

输入的是一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。

Output

输出最大的和。

Sample Input

5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

Sample Output

30

题意描述:给数字三角形,从三角形的顶部到底部有很多条不同的路径。路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。对于每条路径,把路径上面的数加起来可以得到一个和,找到里面最大的和。

解题思路:先利用二维数组存每个数值,然后从三角形行数-1行开始走,先遍历最后一行计算倒数第二行的新值,依此类推,最后输出三角形顶端的那个数即可,也可以正着行走(具体看AC2)。

AC1

#include
#include
#include
using namespace std;
#define N 200
int main(void)
{
	int n;
	int e[N][N];
	while(~scanf("%d",&n))
	{
		memset(e,0,sizeof(e));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=i;j++)
				scanf("%d",&e[i][j]);
		for(int i=n-1;i>=1;i--)
			for(int j=1;j<=i;j++)
				e[i][j]=max(e[i+1][j],e[i+1][j+1])+e[i][j];
		printf("%d\n",e[1][1]);
	}
	return 0;
}

AC2

#include
#include
#include
#define N 200
using namespace std;
int main(void)
{
    int e[N][N];
	int ans=-99999999;
	int n,ans;
	while(~scanf("%d",&n))
	{
        ans=-99999999;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=i;j++)
				scanf("%d",&e[i][j]);
		for(int i=2;i<=n;i++)
			for(int j=1;j<=i;j++)
				e[i][j]=max(e[i-1][j-1],e[i-1][j])+e[i][j];
		for(int i=1;i<=n;i++)
			ans=max(ans,e[n][i]);
		printf("%d\n",ans);
	}
	return 0;
}

有兴趣的也可以做一下新数字三角形问题(OpenJ_Bailian 3262),也可以看我的另一个博客

https://blog.csdn.net/m0_58245389/article/details/119254677

你可能感兴趣的:(DP,动态规划,算法,数据结构)