数字三角形【线性DP】
程序员文章站
2022-07-12 21:30:20
...
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输入格式
第一行包含整数n,表示数字三角形的层数。
接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。
输出格式
输出一个整数,表示最大的路径数字和。
数据范围
1≤n≤5001≤n≤500,
−10000≤三角形中的整数≤10000−10000≤三角形中的整数≤10000
输入样例:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
30
考虑当前点来自左上还是右上
转移方程:dp[i][j]=max(dp[i-1][j-1]+a[i][j],dp[i-1][j]+a[i][j]);
#include<iostream>
using namespace std;
const int N=10010,INF=1e9+10;
int dp[N][N],a[N][N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
for(int i=0;i<=n;i++)
for(int j=0;j<=i+1;j++)
dp[i][j]=-INF;//最右边点的右上不存在,j取到i+1,初始化为负无穷
dp[1][1]=a[1][1];
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i-1][j-1]+a[i][j],dp[i-1][j]+a[i][j]);
}
int ans=-INF;
for(int i=1;i<=n;i++)
ans=max(ans,dp[n][i]);
cout<<ans<<endl;
return 0;
}
上一篇: 求解不等式
下一篇: dp---数字三角形问题
推荐阅读
-
利用原生JS与jQuery实现数字线性变化的动画
-
BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)
-
利用原生JS与jQuery实现数字线性变化的动画
-
C++数字三角形问题与dp算法
-
C++数位DP复杂度统计数字问题示例详解
-
【线性 dp】A005_LC_不同的子序列(记忆化 / dp 分类讨论)
-
【机器学习】【KNN】线性扫描算法,python实现识别手写数字的系统
-
for循环练习 打印4面三角形,99乘法表 ,打印1-100内整数 数字包含9跳过 每行输出5个 用空格分隔,按照从大到小的顺序输出4位数中的个位+百位=十位+千位的数字及个数
-
hiho - 1037 数字三角形(DP)
-
数字三角形(DP)