在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99
输入格式:
5 //表示三角形的行数 接下来输入三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
DP解法1
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int buf[MAX][MAX];
int max_buf[MAX][MAX];
void solve(int pos_x,int pos_y,int &n)
{
int i,j;
for(i = n;i >= 1;i--)
{
if(i == pos_x)
{
j = pos_y;
if(i == n)
{
max_buf[i][j] = buf[i][j];
}
else
{
int x,y;
x = max_buf[i+1][j];
y = max_buf[i+1][j+1];
max_buf[i][j] = max(x,y) + buf[i][j];
}
cout <<max_buf[pos_x][pos_y];
}
else
{
for(j = 1;j <= i;j++)
{
if(i == n)
{
max_buf[i][j] = buf[i][j];
}
else
{
int x,y;
x = max_buf[i+1][j];
y = max_buf[i+1][j+1];
max_buf[i][j] = max(x,y) + buf[i][j];
}
}
}
}
}
int main()
{
int i,j;
int n;
cin >> n;
for(i = 1;i <= n;i++)
{
for(j = 1;j <= i;j++)
{
cin >> buf[i][j];
}
}
solve(1,1,n);
system("pause");
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int buf[MAX][MAX];
int max_buf[MAX][MAX];
int max_buf_p[MAX];//优化的solve2所用
void solve(int pos_x,int pos_y,int &n)
{
int i,j;
for(i = n;i >= 1;i--)
{
if(i == pos_x)
{
j = pos_y;
if(i == n)
{
max_buf[i][j] = buf[i][j];
}
else
{
int x,y;
x = max_buf[i+1][j];
y = max_buf[i+1][j+1];
max_buf[i][j] = max(x,y) + buf[i][j];
}
cout <<max_buf[pos_x][pos_y];
}
else
{
for(j = 1;j <= i;j++)
{
if(i == n)
{
max_buf[i][j] = buf[i][j];
}
else
{
int x,y;
x = max_buf[i+1][j];
y = max_buf[i+1][j+1];
max_buf[i][j] = max(x,y) + buf[i][j];
}
}
}
}
}
//空间再优化
void solve2(int pos_x,int pos_y,int &n)
{
int i,j;
for(i = n;i >= 1;i--)
{
if(i == pos_x)
{
j = pos_y;
if(i == n)
{
max_buf_p[j] = buf[i][j];
}
else
{
int x,y;
x = max_buf_p[j];
y = max_buf_p[j+1];
max_buf_p[j] = max(x,y) + buf[i][j];
}
cout <<max_buf_p[pos_x];
}
else
{
for(j = 1;j <= i;j++)
{
if(i == n)
{
max_buf_p[j] = buf[i][j];
}
else
{
int x,y;
x = max_buf_p[j];
y = max_buf_p[j+1];
max_buf_p[j] = max(x,y) + buf[i][j];
}
cout <<max_buf_p[pos_x];
}
}
}
}
int main()
{
int i,j;
int n;
cin >> n;
for(i = 1;i <= n;i++)
{
for(j = 1;j <= i;j++)
{
cin >> buf[i][j];
}
}
solve2(1,1,n);
system("pause");
return 0;
}