動態(tài)規(guī)劃入門01

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;
}

說明

對于以下函數(shù):

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];
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容