Difficulty: easy
Algorithms: Dynamic Programming
Source: http://acm.nuc.edu.cn/OJ/problem.php?pid=1041
Solution Description: 这是一个简单的动态规划问题。设d(i, j)表示第从(i,j)出发时能得到的最大的和(包括(i,j)本身),这样状态转移方程为:d(i, j) = a(i, j) + max{d(i + 1, j), d(i + 1, j + 1)},最后结果就是d(1, 1)可以用递推计算,也可用记忆化搜索,时间复杂度为O(n2)。由于此题不涉及路径打印,也可以把d(i, j)用一维数组来表示,自底向上计算,最后d(1)就是所要求的结果,这样能节省空间开销。
递推求解:
for(i = 1; i <= n; i++) //初始化
d[n][i] = num[n - 1][i];
for(i = n - 1; i > 0; i--)
for(j = 1; j <= i; j++){
d[i][j] = num[i][j] + (d[i + 1][j] >? d[i + 1][j + 1]);
}
记忆化搜索:
memset(d, -1, sizeof(d));
int df(int i, int j)
{
if(d[i][j] >= 0)
return d[i][j];
return d[i][j] = num[i][j] + (i == n - 1 ? 0 : df(i + 1, j) >? df(i + 1, j + 1));
}
一维数组:
for(i = 1; i <= n; i++)
d[i] = num[n][i];
for(i = n - 1; i > 0; i--)
for(j = 1; j <= i; j++)
d[j] = ((d[j] >? d[j + 1]) + num[i][j]);
cout<<d[1]<<endl;