动态规划——数字金字塔【集训笔记】

动态规划——数字金字塔【集训笔记】观察下面的数字金字塔

大家好,欢迎来到IT知识分享网。

题目描述

动态规划——数字金字塔【集训笔记】

输入

输出

单独的一行,包含那个可能得到的最大的和。

样例输入1

样例输出1

86

提示/说明

标签

普及 其他 递归 递推 记忆化搜索 动态规划基础

方法一

暴搜

时间超限67

方法二

顺推

动规

状态转移方程:

向左走:f[i+1][j]>f[i][j]+a[i+1][j]?f[i+1][j]:f[i][j]+a[i+1][j]

向右走:f[i+1][j+1]>f[i][j]+a[i+1][j+1]?f[i+1][j+1]:f[i][j]+a[i+1][j+1]

代码:

#include<iostream> using namespace std; #define MAXN 1010 int a[MAXN][MAXN],f[MAXN][MAXN]; int n; int main(){ cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<i+1;j++){ cin>>a[i][j]; } } f[0][0]=a[0][0]; for(int i=0;i<n-1;i++){ for(int j=0;j<i+1;j++){ f[i+1][j]=f[i+1][j]>f[i][j]+a[i+1][j]?f[i+1][j]:f[i][j]+a[i+1][j]; f[i+1][j+1]=f[i+1][j+1]>f[i][j]+a[i+1][j+1]?f[i+1][j+1]:f[i][j]+a[i+1][j+1]; } } int ans=f[n-1][0]; for(int i=1;i<n;i++){ ans=ans>f[n-1][i]?ans:f[n-1][i]; } cout<<ans; return 0; }

方法三:逆推

动态规划——数字金字塔【集训笔记】

#include<iostream> using namespace std; int n; int a[1005][1005],f[1005][1005]; int main(){ cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<i+1;j++){ cin>>a[i][j]; } } for(int i=0;i<n;i++){ f[n-1][i]=a[n-1][i]; } for(int i=n-2;i>=0;i--){ for(int j=0;j<i+1;j++){ f[i][j]=a[i][j]+(f[i+1][j]>f[i+1][j+1]?f[i+1][j]:f[i+1][j+1]); } } cout<<f[0][0]; return 0; }

方法四:记忆化搜索

动态规划——数字金字塔【集训笔记】

#include<bits/stdc++.h> #define maxx 1005 using namespace std; int r,a[maxx][maxx],f[maxx][maxx]; int dfs(int x,int y){ if(f[x][y]>=0) return f[x][y]; if(x==r) f[x][y]=a[x][y]; else f[x][y]=max(dfs(x+1,y),dfs(x+1,y+1))+a[x][y]; return f[x][y]; } int main(){ cin>>r; for(int i=1;i<=r;i++){ for(int j=1;j<=i;j++){ cin>>a[i][j]; } } memset(f,-1,sizeof(f)); cout<<dfs(1,1)<<'\n'; return 0; }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134606.html

(0)
上一篇 2025-07-11 12:26
下一篇 2025-07-11 12:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信