Description
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1)
Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output
30
一个如图的数字三角形,每个点上都有些数字,从最上层开始,往下走,要么左下,要么右下,求走到最底层的路径中途径的数字和最大是多少。
这是笔者做的第一道动态规划的题,从上往下贪心肯定会出大问题。那么就从下往上。
d[i][j]表示第i层的第j个点往下走可以获得的最大和,由于只能往左下或者右下走,所以d[i][j]=max(d[i+1][j+1],d[i+1][j]),这个东西叫做状态转移方程,是动态规划的核心所在。这样相当于从下往上贪心,是不会出问题的。最后d[0][0]就是答案。这也就包含了一个“全局最优解一定包含局部最优解”的思想。
当然,dfs也是可以的,只要你电脑的CPU够强大。。。。。。。
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; int main() { int n,i,j,a[100][100]={0}; scanf("%d",&n); for (i=0;i<=n-1;i++) { for (j=0;j<=i;j++) { scanf("%d",&a[i][j]); } } for (i=n-2;i>=0;i--) { for (j=0;j<=i;j++) { a[i][j]=a[i][j]+max(a[i+1][j],a[i+1][j+1]); } } printf("%d",a[0][0]); return 0; }