POJ-1163(The Triangle)动态规划基础题

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers 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.
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

就是你身处最三角形的顶端,你可以选择向下紧邻两个的左边或右边走,然后求你所走路标的最大总和

这题可以从递归的角度来理解,即要求当前这个的最大值只要知道左边的最大值和右边的最大值哪个大就可以,当然这道题用递归完全可以写出来,只要把重复计算的值存储起来就可以了。但用动态规划的思路更容易,即从倒数第二层开始进行运算,把下面相邻两个数里面最大的那个加到当前位置,然后运算到第一层时就可以得到答案了。

完整代码如下:

#include
#include
#include
#include
#define MAX 110
using namespace std;
int dp[MAX][MAX];
int main(void){
    int n;
    while(cin >> n){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++)
                cin >> dp[i][j];
        }
        for(int i=n-1;i>=1;i--){//从倒数第二层开始进行运算 
            for(int j=1;j<=i;j++){
                dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + dp[i][j];//相邻两个最大的加上当前位置的值 
            }
        }
        cout << dp[1][1] << endl;
    } 
    return 0;
}

你可能感兴趣的:(动态规划)