问题描述
有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,从第一行的数开始,每次可以往左下和右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何才能使这个和最大??
状态转移方程由来的分析
需要用抽象的方法思考问题:把当前的位置(i,j)看成一个状态,然后定义状态(i,j)的指标函数d(i,j)为从格子(i,j)出发时能得到的最大和(包括(i,j)本身的值)。在这个状态定义下,原问题的解为d(1,1).
从格子(i,j)出发有两种决策,往左下走或者往右下走,应选择d(i+1,j),d(i+1,j+1)中较大的那一个,即
d(i,j)=(i,j)+max{d(i+1,j),d(i+1,j+1)}
记忆化搜索与递推
!!注意边界处理:即i=n时
记忆化搜索
虽然不像递推法那样显示的指明了计算顺序,但可保证每个节点只访问一次,时间复杂度为o(n^2)
首先用“menset(d,-1,sizeof(d));”把d全部初始化为-1,然后编写递归函数
<php>
int solve(int i,int j)
{if(d[i][j]!=-1) return d[i][j];
return d[i][j]=a[i][j]&#