给定一个由n行数字组成的数字三角形,设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大;
三角形的第i行有i个数(i=1...n),对于i,j,位置只能走到i+1,j与i+1,j+1位置;
输入
n代表层数,下面是n层;(1<=n<350) (三角形里的数<100);
输出
最大和
样例输入
2 97 11 88
样例输出
185
思路:
这个题要是利用动态规划来做的话,采取的是逆向的思维,对倒数两行进行操作,比如最后一行11和88,显然88大于11,所以99+88;这样依次类推,先将这些数存放到两个数组中,一个存放原数。一个利用这个思维存放不断更新的数。那么这样到最后的AnsNum[0][0]就是要求的最大值。
#include <stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
long long num1[1005][1005];
long long AnsNum[1005][1005];
int n;
void Triangle(){
int r;
int c;
for(int r=n-2;r>=0;r--){
for(c=0;c<=r;c++){
if(AnsNum[r+1][c]>AnsNum[r+1][c+1])
AnsNum[r][c]+=AnsNum[r+1][c];
else
AnsNum[r][c]+=AnsNum[r+1][c+1];
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<i+1;j++){
scanf("%lld",&num1[i][j]);
AnsNum[i][j]=num1[i][j];
}
}
Triangle();
printf("%lld",AnsNum[0][0]);
return 0;
}