poj3176

一、题意:给定一些数,成三角形排列。从上往下走,每个数只能往它相邻的两个数走,一直走到底端得到一条线路。这条线路上的数的和最大是多少

二、思路:简单的动态规划。dp[i+1][j+1]:=以第i+1行j+1列为最后一个数字所能得到的最大和。所有的初始值均设为0,那么从上往下递推,可得到以每一个数为结尾的最大和,这样只要比较最后一行所能得到的最大和是多少即可。递推式为:dp[i+1][j+1]=max(dp[i][j],dp[i][j+1])+tri[i][j];

三、代码:

#include"iostream"
#include"stdio.h"
#include"string.h"
using namespace std;
const int MAXN=355;
int dp[MAXN][MAXN];
int tri[MAXN][MAXN];
int GetMaxSum(int n)
{
    memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            dp[i+1][j+1]=max(dp[i][j+1],dp[i][j])+tri[i][j];
        }
    }
    int res=0;
    for(int j=0;j<n;j++)
    {
        if(dp[n][j+1]>res) res=dp[n][j+1];
    }
    return res;
}

int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<=i;j++)
                scanf("%d",&tri[i][j]);
        cout<<GetMaxSum(n)<<endl;
    }
    return 0;
}
View Code

 

posted @ 2019-01-23 21:33  Run_For_Love  阅读(198)  评论(0编辑  收藏  举报