内容参考书籍《算法竞赛入门到进阶》
先看一道经典题:poj1163 http://poj.org/problem?id=1163
如果此题按照从上往下的方法计算,每走一步下一步就有2种选择,其复杂度为2n
那么我们从下往上算,下面给出dfs代码:
int dfs(int i,int j)
{
if (i == n) return a[i][j];//递归到最后一行返回
return dp[i][j] = max(dfs(i+1,j),dfs(i+1,j+1))+ a[i][j];
}
从1,1开始往下走,一直到最后一行,返回,每一次取能走到该点的最大值加上该点,继续返回,代码很好理解,只是复杂度为2n
下面我们再来讲一下递推,代码如下: