P1216 数字三角形 Number Triangles
水题中...解题思路题解代码(AC+注释)洛谷链接解题思路 考虑使用动态规划。先考虑状态,貌似需要定义状态dp[i][j]表示从三角形的第i行j列做出策略(即从此出发)后的最好状态(当前最大和,部分最优解)。则状态转移方程为:dp[i][j]=a[i][j]max(dp[i][j],dp[i][j+1])。这明显是一个逆序枚举,从初始第一个位置出发就好,会一直记忆化搜索到最顶层返回。题解代码(AC
·
水题中...
洛谷链接
解题思路
考虑使用动态规划。先考虑状态,貌似需要定义状态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;
}
更多推荐
已为社区贡献1条内容
所有评论(0)