1197: 三角形
时间限制: 1 Sec 内存限制: 128 MB题目描述
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
提示
来源
分析:
1、一开始写出程序测试总不对,然后百度了一下,发现是题目中排序有问题,数字呈等腰三角形,但是题目给的是直角三角形。(晕)
2、本题还是很简单的,简单的dp题,每一个数进行遍历,更新当前的和。特殊处理一下边缘的数就行。
LANGUAGE:C++
CODE:
<span style="font-size:14px;">#include <iostream>
#include <cmath>
#define rep(i,a,n) for(int i=a;i<n;i++)
using namespace std;
int main()
{
int t;
cin>>t;
int mz[105][105],dp[105][105];
while(t--){
int n,ma_x=-100;
cin>>n;
rep(i,0,n){
rep(j,0,i+1){
cin>>mz[i][j];
if(i>0){
if(j>0&&j<i)
dp[i][j]=mz[i][j]+max(dp[i-1][j-1],dp[i-1][j]);
else if(j>0)
dp[i][j]=mz[i][j]+dp[i-1][j-1];
else if(j<i)
dp[i][j]=mz[i][j]+dp[i-1][j];
else
dp[i][j]=mz[i][j];
}
else
dp[i][j]=mz[i][j];
if(ma_x<dp[i][j])
ma_x=dp[i][j];
}
}
cout<<ma_x<<endl;
// rep(i,0,n){
// rep(j,0,i+1){
// cout<<dp[i][j]<<' ';
// }
// cout<<endl;
// }
}
return 0;
}</span>