《程序设计与算法算法基础》《第六周 分治》动态规划

Posted focus-z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《程序设计与算法算法基础》《第六周 分治》动态规划相关的知识,希望对你有一定的参考价值。

1163:The Triangle

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述
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.
输入
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.
输出
Your program is to write to standard output. The highest sum is written as an integer.
样例输入
5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5
样例输出
30
/*
http://bailian.openjudge.cn/practice/1163/
1163:The Triangle
递归解法2:数字三角形的记忆递归型动归程序
*/
#include<iostream>
#include<algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int sum[MAX][MAX];
int n;
int MaxSum(int i, int j)
{
    if (sum[i][j] != -1)/*说明这个路径的最大和已经算过了*/
    {
        return sum[i][j];
    }
    if (i == n)
    {
        sum[i][j] = D[i][j];
    }
    else
    {
        int x = MaxSum(i + 1, j);
        int y = MaxSum(i + 1, j + 1);
        sum[i][j] = max(x, y) + D[i][j];
    }
    return sum[i][j];
}
int main()
{
    int i, j;
    cin >> n;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j <= i; j++)
        {
            cin >> D[i][j];
            sum[i][j] = -1;
        }
    }
    cout << MaxSum(0, 0) << endl;
    return 0;

}

 

以上是关于《程序设计与算法算法基础》《第六周 分治》动态规划的主要内容,如果未能解决你的问题,请参考以下文章

背包问题(动态规划)

分治算法与动态规划的区别

算法设计与分析期中考试复习:代码和经典题目 分治二分动态规划(未完待续)

动态规划算法--01背包问题

五大算法:分治,贪心,动态规划,回溯,分支界定

『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)