一、题目
2760:数字三角形
- 题目链接:http://poj.grids.cn/practice/2760/
- 时间限制: 1000ms 内存限制: 65536kB
- 描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图1)
图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。- 输入
- 输入的是一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
- 输出
- 输出最大的和。
- 样例输入
-
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
- 样例输出
-
30
二、分析
1、递归求解,遍历每一种可能情况
2、动态规划,按级往下走,找出最优解
三、AC源代码
动态规划法:
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int triangle[100][100];
6 int i,j,n,max=0;
7 cin>>n;
8 for(i=0;i<n;i++)
9 for(j=0;j<=i;j++)
10 cin>>triangle[i][j];
11 for(i=1;i<n;i++)
12 for(j=0;j<=i;j++)
13 if(j==0)
14 triangle[i][j]+=triangle[i-1][j];
15 else if(j==i)
16 triangle[i][j]+=triangle[i-1][j-1];
17 else
18 if(triangle[i-1][j]>triangle[i-1][j-1])
19 triangle[i][j]+=triangle[i-1][j];
20 else
21 triangle[i][j]+=triangle[i-1][j-1];
22 for(i=0;i<n;i++)
23 if(triangle[n-1][i]>max)
24 max=triangle[n-1][i];
25 cout<<max<<endl;
26 return 0;
27 }