洛谷链接

解题思路

 考虑使用动态规划。先考虑状态,貌似需要定义状态dp[i][j]表示从三角形的第i行j列做出策略(即从此出发)后的最好状态(当前最大和,部分最优解)。则状态转移方程为:dp[i][j]=a[i][j]max(dp[i][j],dp[i][j+1])。这明显是一个逆序枚举,从初始第一个位置出发就好,会一直记忆化搜索到最顶层返回。

题解代码(AC+注释)

#include<iostream>
#include<algorithm>//有很多算法函数,至少可以用min哦
#include<cstring>//使用memsent需要
using namespace std;
int n;//将n即三角形行数定义为全局变量,因为在slove函数中需要使用到n判断是否超出顶层(顶层也会递归再往上,但这里就可以终止所有递归返回了)
const int N=10000;//定义最大行数
int dp[N][N], a[N][N] = {};//a用来存储三角形,dp用来存储记忆化搜索内容
int slove(int i, int j)//返回从i j出发的最大路径和
{
	if (i == n)return 0;//如果达到最顶层的上面,该回头了浪子
	if (dp[i][j] != -1)return dp[i][j];//如果有值则直接返回(否则以空间为代价换时间干嘛,直接递归不就行了)
	return (dp[i][j]=a[i][j] + max(slove(i+1,j), slove(i+1,j+1)));//(使用状态转移方程求解)
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j <= i; j++)//第0行一个,第1行两个...
		{
			cin >> a[i][j];
		}
	memset(dp, -1, sizeof(dp)); //初始化一下dp数组
	cout << slove(0, 0) << endl;//输出结果
	return 0;
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐