标签:数字 int Number 一行 Triangles 三角形 include 1010 dp
我的第200道题目.
可以当成动态规划的模板了,非常简单.主要是想先把动态规划的内容回忆起来,先前觉得难跳过了这一部分的刷题.
通过这种方式存储数据后,即可用s[i][j]来表示第i行第j个数,且d[i + 1][j], d[i + 1][j + 1]分别表示该数字左下方和右下方的数字.
要退出最大路径,从最后一行往上推,用dp[i][j]存储从位置(i,j)到最后一行能产生的最大路径.那么:
dp[n][j] = s[n][j].
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + s[i][j].(注意第i + 1行是第i行的下一行)
实现如下:
#include <algorithm> #include <cstdio> #include <cstring> #include <iostream> using namespace std; int n; int s[1010][1010], dp[1010][1010]; int rec(){ for(int i = n; i >= 1; i--) for(int j = 1; j <= i; j++) dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + s[i][j]; return dp[1][1]; } int main(){ cin >> n; for(int i = 1; i <= n; i++) for(int j = 1; j <= i; j++) cin >> s[i][j]; printf("%d\n", rec()); return 0; }View Code
注意到不需要先初始化dp[n][j],在第一次循环时已经使得dp[n][j] = dp[n + 1][j] + s[n][j],dp[n + 1][j]初始值为0,效果即dp[n][j] = s[n][j].
最后输出最高点到最后一行能产生的最大路径dp[1][1]即答案.
标签:数字,int,Number,一行,Triangles,三角形,include,1010,dp 来源: https://www.cnblogs.com/Gaomez/p/14075447.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。