一道典型动态规划题

问题 1177: 三角形

时间限制: 1Sec 内存限制: 128MB 提交: 121 解决: 53

题目描述

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<iostream>
#include<string.h>
using namespace std;
int main()
{
//freopen("C://Users/Administrator/Desktop/acm.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
int N;
cin>>N;
int num[N][N];
for(int i=0;i<N;i++)
{
for(int j=0;j<=i;j++)
cin>>num[i][j];
}

int max[N][N];
memset(max,sizeof(max),0);
int t=0;int t2=0;
for(int i=0;i<N;i++)
{
max[i][0]=num[i][0]+t;
t=max[i][0];
max[i][i]=num[i][i]+t2;
t2=max[i][i];
}
for(int i=0;i<N;i++)
{
for(int j=1;j<i;j++)
{
max[i][j]=(max[i-1][j-1]>max[i-1][j])?max[i-1][j-1]+num[i][j]:max[i-1][j]+num[i][j];
}
}
int result=max[N-1][0];
for(int i=0;i<N;i++)if(max[N-1][i]>result)result=max[N-1][i];
cout<<result<<endl;
}
//fclose(stdin);
return 0;
}

原文地址:https://www.cnblogs.com/linruier/p/8894150.html