递归变递推,DP

#include <bits/stdc++.h>
#include<algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX];
int n;int *maxSum;
int main(){
	int i,j;
	cin>>n;
	for(i=1;i<=n;i++)
	    for(j=1;j<=i;j++)
	       cin>>D[i][j];
	       maxSum=D[n];//maxSum  point at di n hang
	    
	    for(int i=n-1;i>=1;i--)
	        for(int j=1;j<=i;++j)
	           maxSum[j]=
	              max(maxSum[j],maxSum[j+1])+D[i][j];
				  cout<<maxSum[1]<<endl;    
} 

### 关于C++数字三角形的递归递推算法 #### 1. **递归算法实现** 递归适用于问题可以分解为子问题的情况。对于数字三角形问题,可以通过从底部向上计算最大路径和的方式解决问题。 以下是基于递归思想的一个简单实现: ```cpp #include <iostream> #include <vector> using namespace std; int maxPathSum(vector<vector<int>>& triangle, int row, int col) { if (row == triangle.size() - 1) { // 如果到达最后一行,则返回当前值 return triangle[row][col]; } // 向下一层移动时有两种选择:左下方或右下方 int leftMax = maxPathSum(triangle, row + 1, col); // 左下方的最大路径和 int rightMax = maxPathSum(triangle, row + 1, col + 1); // 右下方的最大路径和 return triangle[row][col] + max(leftMax, rightMax); // 当前位置加上较大的那个 } int main() { vector<vector<int>> triangle = { {7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4}, {4, 5, 2, 6, 5} }; cout << "最大路径和:" << maxPathSum(triangle, 0, 0) << endl; return 0; } ``` 上述代码展示了如何通过递归来找到数字三角形中的最大路径和[^3]。需要注意的是,这种纯递归方式可能会因为重复计算而导致效率低下。 --- #### 2. **递推算法实现** 为了提高效率,可以使用动态规划的思想来避免重复计算。这种方法通常被称为记忆化搜索或者自底向上的递推法。 下面是基于递推的解决方案: ```cpp #include <iostream> #include <vector> using namespace std; int maxPathSumDP(const vector<vector<int>>& triangle) { int n = triangle.size(); vector<vector<int>> dp(n, vector<int>(n)); // 创建 DP 表格 // 初始化最底层 for (int i = 0; i < n; ++i) { dp[n - 1][i] = triangle[n - 1][i]; // 将最后一层复制到 DP 中 } // 自底向上填充表格 for (int row = n - 2; row >= 0; --row) { for (int col = 0; col <= row; ++col) { dp[row][col] = triangle[row][col] + max(dp[row + 1][col], dp[row + 1][col + 1]); } } return dp[0][0]; // 返回顶部的结果 } int main() { vector<vector<int>> triangle = { {7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4}, {4, 5, 2, 6, 5} }; cout << "最大路径和:" << maxPathSumDP(triangle) << endl; return 0; } ``` 此代码实现了自底向上的递推逻辑,从而有效减少了冗余计算,并显著提高了性能[^5]。 --- #### 总结 - 使用递归方法可以直接表达问题的本质,但可能面临时间复杂度较高的问题。 - 动态规划(即递推)则能够更高效地解决此类问题,尤其适合大规模数据集。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值