文章目录
1. 数字三角问题
问题描述:给定一个由n行数字组成的数字三角形,如下图所示
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
如上图最大值为30=7+3+8+7+5
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int inf=0x7f7f7f7f;
const int N=1e3+5;
int a[N][N];
int dp[N][N][2]; // [0] 记录最值 ,[1] 记录 路线方向
/* 转移方程
*到达位置(i,j) 只能从 (i-1,j) 或 (i-1,j-1) 位置出发
*dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i-1][j-1]+a[i][j]);
*/
void pr(int x,int y) // 打印路线
{
if(x!=1)
{
if(dp[x][y][1]==1)
{
pr(x-1,y);
}
else pr(x-1,y-1);
}
printf("(%d,%d)\n",x,y);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
memset(dp,0,sizeof(0));
dp[1][1][0]=a[1][1];
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(dp[i-1][j][0]+a[i]