You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# include <bits/stdc++.h>
//数塔问题解析
// https://blog.csdn.net/theonegis/article/details/45801201
using namespace std ;
/************************************************************************/
/* 数塔问题 */
/************************************************************************/
const int N = 50 ; //为了算法写起来简单,这里定义一个足够大的数用来存储数据(为了避免运算过程中动态申请空间,这样的话算法看起来比较麻烦,这里只是为了算法看起来简单)
int data [ N ] [ N ] ; //存储数塔原始数据
int dp [ N ] [ N ] ; //存储动态规划过程中的数据
int n ; //塔的层数
/*动态规划实现数塔求解*/
void tower_walk ( )
{
// dp初始化
for ( int i = 0 ; i < n ; + + i )
{
dp [ n - 1 ] [ i ] = data [ n - 1 ] [ i ] ;
}
int temp_max ;
for ( int i = n - 1 ; i > = 0 ; - - i )
{
for ( int j = 0 ; j < = i ; + + j )
{
// 使用递推公式计算dp的值
temp_max = max ( dp [ i + 1 ] [ j ] , dp [ i + 1 ] [ j + 1 ] ) ;
dp [ i ] [ j ] = temp_max + data [ i ] [ j ] ;
}
}
}
/*打印最终结果*/
void print_result ( )
{
cout < < " 最大路径和: " < < dp [ 0 ] [ 0 ] < < ' \n ' ;
int node_value ;
// 首先输出塔顶元素
cout < < " 最大路径: " < < data [ 0 ] [ 0 ] ;
int j = 0 ;
for ( int i = 1 ; i < n ; + + i )
{
node_value = dp [ i - 1 ] [ j ] - data [ i - 1 ] [ j ] ;
/* 如果node_value == dp[i][j]则说明
下一步应该是data[i][j];
如果node_value == dp[i][j + 1]则说明
下一步应该是data[i][j + 1]
*/
if ( node_value = = dp [ i ] [ j + 1 ] ) + + j ;
cout < < " -> " < < data [ i ] [ j ] ;
}
cout < < endl ;
}
int main ( )
{
cout < < " 输入塔的层数: " ;
cin > > n ;
cout < < " 输入塔的节点数据(第i层有i个节点): \n " ;
for ( int i = 0 ; i < n ; + + i )
{
for ( int j = 0 ; j < = i ; + + j )
{
cin > > data [ i ] [ j ] ;
}
}
tower_walk ( ) ;
print_result ( ) ;
}