时间限制: 1Sec 内存限制: 128MB
题目描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图一)
图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。
每一步只能由当前位置向左下或右下。
输入
你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试次数。
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。
输出
输出每次测试的最大值并且占一行。
样例输入
1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出
30
思路:动态规划,贪心法不能求出最大解
#include<bits/stdc++.h>
#define N 50
using namespace std;
int a[N][N][3]; //a[N][N][0]记录求解路径,a[N][N][1]存储的数据,a[N][N][2]部分解的结果
int n;
void operate()
{
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
if(a[i+1][j][2]>a[i+1][j+1][2])
{
a[i][j][2]=a[i][j][2]+a[i+1][j][2];
}
else
{
a[i][j][2]=a[i][j][2]+a[i+1][j+1][2];
a[i][j][0]=1;
}
}
}
}
int main()
{
int m;
cin>>m;
while(m--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>a[i][j][1];
a[i][j][2]=a[i][j][1];
a[i][j][0]=0;
}
}
operate();
cout<<a[1][1][2]<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
a[i][j][0]=0;
a[i][j][1]=0;
a[i][j][2]=0;
}
}
}
return 0;
}
?