美文网首页
动态规划入门01

动态规划入门01

作者: qratosone | 来源:发表于2016-08-11 21:35 被阅读0次

http://poj.org/problem?id=1163

题目

Description

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 <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];//保存每次计算的结果
int MaxSum(int i,int j){
    if(maxSum[i][j]!=-1){
        return maxSum[i][j];
    }
    if(i==n){
        maxSum[i][j]=D[i][j];
        //走到最后一行了
    }
    else{
        int x=MaxSum(i+1,j);//往左走
        int y=MaxSum(i+1,j+1);//往右走
        maxSum[i][j]=max(x,y)+D[i][j];//加上当前的和
    }
    
    return maxSum[i][j];
}
int main(){
    int i,j;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>D[i][j];
            maxSum[i][j]=-1;
        }
    }
    cout<<MaxSum(1,1)<<endl;
    return 0;
}

说明

对于以下函数:

int MaxSum(int i,int j){
    if(i==n){
        return D[i][j];
        //走到最后一行了
    }
    int x=MaxSum(i+1,j);//往左走
    int y=MaxSum(i+1,j+1);//往右走
    return max(x,y)+D[i][j];//加上当前的和
}

相当于递归调用不断求出每一条路径的值,并且比较大小——但是直接提交的话会超时,因为重复的计算太多。
如果每算出一个值就保存起来的话,那么第二次需要相同的值的时候就可以直接进行调用,如下所示:

int MaxSum(int i,int j){
    if(maxSum[i][j]!=-1){
        return maxSum[i][j];
    }
    if(i==n){
        maxSum[i][j]=D[i][j];
        //走到最后一行了
    }
    else{
        int x=MaxSum(i+1,j);//往左走
        int y=MaxSum(i+1,j+1);//往右走
        maxSum[i][j]=max(x,y)+D[i][j];//加上当前的和
    }
    
    return maxSum[i][j];
}

相关文章

  • 动态规划入门01

    http://poj.org/problem?id=1163 题目 Description 73 88 1...

  • 这篇将动态规划的文章不错,大家可以看一下

    教你彻底学会动态规划——入门篇

  • 算法学习收藏

    动态规划问题 动态规划(最优子结构和重叠子问题的比较) 动态规划解决01背包问题 01背包问题 最优二叉查找树 《...

  • 动态规划入门

    动态规划入门 动态规划(Dynamic programming, 简称DP), 通过把原问题分解为相对简单的子问题...

  • 算法与数据结构网址备忘

    kd-tree算法原理与开源代码实现 详解kd-tree 动态规划入门篇 动态规划进阶篇

  • 动态规划

    链接:很特别的一个动态规划入门教程动态规划与贪心算法的区别与联系 那么遇到问题如何用动态规划去解决呢?根据上面的分...

  • 从斐波那契到01背包 - 我理解的DP

    从斐波那契到01背包 - 我理解的DP 01背包问题是动态规划的经典入门题目,为了更好的总结与检验,我决定写一篇博...

  • 动态规划01

    动态规划作为暑期集训第一天的内容,相对简单一些,然而动态规划后面也有几道很难的题目,我们以第一道数字三角形开始:题...

  • 动态规划入门

    算法简述 动态规划(dynamic programming, 简称dp)是一种应用十分广泛的算法。它可以理解成是对...

  • 动态规划入门

    伟大的acm大神谷哥教我学算法. 引例 斐波那契数 定义一个函数,f(x) = f(x-1) + f(x-2),x...

网友评论

      本文标题:动态规划入门01

      本文链接:https://www.haomeiwen.com/subject/czyssttx.html