首页 > 其他 > 详细

动态规划——数字三角形

时间:2018-03-26 22:24:57      阅读:248      评论:0      收藏:0      [点我收藏+]
数字三角形问题。有一个由非负数组成的三角形,如图所示。
技术分享图片
从第一行开始,每次可以往左下或者右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何走才能使得这个和最大?
我们最常规的想法:就是利用回溯发,将每一条路径都遍历一遍,然后选出最长的路径。
此题更高效的算法是动态规划。把当前位置(i,j)看成一个状态,然后定义指标函数d(i,j)为从格子(i,j)出发的能得到的最大的和(包括次格子本身),那么本题就转化成了求d(1,1)。
在动态规划的题目里,状态转移方程无疑是非常重要的,下面我们来看看状态转移方程d(i,j)=a(i,j)+max{d(i+1,j),d(i+1,j+1)}其中a(i,j)表示每个圆形的数字
下面给出代码

#include<iostream>
#include<algorithm>
using namespace std;
int value[4][4];
int dp[4][4];
int main()
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<=i;j++)
        cin>>value[i][j];
    }
    for(int i=0;i<4;i++)
    dp[3][i]=value[3][i];
    for(int i=2;i>=0;i--)
    for(int j=0;j<=i;j++)
    dp[i][j]=value[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
    cout<<dp[0][0];
    return 0;
}

动态规划——数字三角形

原文:http://blog.51cto.com/13642075/2091372

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!