从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大。如下:
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
题解
用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算。
从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。
代码
int main()
{
int n,data[50][50],dp[50][50];
cin >> n;
for (int i = 0;i < n;i++)
for (int j = 0;j <= i;j++)
cin >> data[i][j];
for (int i = 0;i < n;i++)
dp[n - 1][i] = data[n - 1][i];
for(int i=n-2;i>=0;i--)
for (int j = 0;j <= i;j++) {
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + data[i][j];
}
cout << dp[0][0] << endl;
cout << "路径为:" << data[0][0];
int j = 0;
for (int i = 1;i < n ;i++)
{
int temp = dp[i - 1][j] - data[i - 1][j];
if (temp == dp[i][j + 1])
j++;
cout << "->" << data[i][j];
}
cout << endl;
}