Consider the number triangle shown below. Write a program that calculates the highest sum of numbers that can be passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
In the sample above, the route from 7 to 3 to 8 to 7 to 5 produces the highest sum: 30.
PROGRAM NAME: numtri
INPUT FORMAT
The first line contains R (1 <= R <= 1000), the number of rows. Each subsequent line contains the integers for that particular row of the triangle. All the supplied integers are non-negative and no larger than 100.
SAMPLE INPUT (file numtri.in)
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
OUTPUT FORMAT
A single line containing the largest sum using the traversal specified.
SAMPLE OUTPUT (file numtri.out)
30
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 int m[1005][1005]; 6 int main() 7 { 8 freopen("numtri.in","r",stdin); 9 freopen("numtri.out","w",stdout); 10 int r; 11 cin>>r; 12 for(int i=1;i<=r;i++){ 13 for(int j=1;j<=i;j++){ 14 cin>>m[i][j]; 15 } 16 } 17 for(int i=1;i<=r;i++){ 18 for(int j=1;j<=i;j++){ 19 if(j==1) m[i][j]+=m[i-1][j]; 20 else if(j==i) m[i][j]+=m[i-1][j-1]; 21 else m[i][j]+=max(m[i-1][j-1],m[i-1][j]); 22 } 23 } 24 int maxn=0; 25 for(int i=1;i<=r;i++){ 26 if(maxn<m[r][i]) maxn=m[r][i]; 27 } 28 cout<<maxn<<endl; 29 return 0; 30 }
原文:http://www.cnblogs.com/shenyw/p/5160322.html