算法训练 数字三角形

题解:动态规划入门题,动态转移方程(规律)就是 当前位置最大值就是上一行的数和上一行前一列的数去最大值加到当前项,就是最优的,这道题可以顺推,也可以逆推。道理类似。

顺推:需要遍历最后一行里面最大值就是答案

#include<bits/stdc++.h>
using namespace std;
int n,a[110][110],dp[110][110];
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=i; j++)
            cin>>a[i][j];

        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],dp[i-1][j])+a[i][j];
    int maxn=0;
    for(int i=n-1; i<=n; i++)
        for(int j=1; j<=i; j++)
            maxn=max(dp[i][j],maxn);
    cout<<maxn<<endl;

    return 0;
}

逆推:最后一个就是最大值。

#include<bits/stdc++.h>
using namespace std;
int n,a[110][110],dp[110][110];
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=i; j++)
            cin>>a[i][j];
    for(int i=n; i<=n; i++)
        for(int j=1; j<=i; j++)
            dp[i][j]=a[i][j];
    for(int i=n-1; i>=1; i--)
        for(int j=1; j<=i; j++)
            dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
    cout<<dp[1][1]<<endl;
    return 0;
}

 

相关文章: