动态规划—数字三角形

时间:2020-04-13
本文章向大家介绍动态规划—数字三角形,主要包括动态规划—数字三角形使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

动态规划——数字三角形

题目描述

请编一个程序根据展示出的三角形,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。

每一步可沿左斜线向下或右斜线向下走;

三角形行数小于等于100;

三角形中的数字为整数;

输入描述


第一行为N,表示有N行 

后面N行表示三角形每条路的路径权

输出描述


路径所经过的数字的总和最大的答案

样例

输入

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

 

输出

30

 

样例解析

7 -> 3 -> 8 -> 7 -> 5=30


动态规划


1.三角形数组存储方法

二维数组,双层循环,

for(int i=1;i<n;i++){
  for(int j=0;j<i+1;j++){
    
  }
}

 2.错误思路:

每次找下面两个元素的最大值,以此类推
(错误)代码:
f[i][j]=max(s[i-1][j],s[i-1][j-1]);
反例:
如果另一条路下面有一个非常大的,就不合适了
3
1         4
1000     9         4
很明显,就是错误的

3.正确思路:

递推关系式,用另一个数组f表示当前状态,即
f[i][j]=max(f[i-1][j],f[i-1][j-1])+s[i][j];
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n,maxx=-1;
    cin>>n;
    int s[101][101];
    int f[101][101];
    long long sum=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<i+1;j++){
            cin>>s[i][j];
        }
    }
    f[0][0]=s[0][0];
    for(int i=1;i<n;i++){
        for(int j=0;j<i+1;j++){
            f[i][j]=max(f[i-1][j],f[i-1][j-1])+s[i][j];
        }
    }
    for(int j=0;j<n;j++){
        if(maxx<f[n-1][j]){
            maxx=f[n-1][j];
        }
    }
    
    cout<<maxx;
    return 0;
}

入门  27题
普及   7题
普及/提高   1题

原文地址:https://www.cnblogs.com/AK-IOI/p/DP.html