数字金字塔

题目链接

简单模型:DP

(虽然是一道IOI的题目)

法1:顺推。从上到下选择大者相加,在最后一行选择最大者输出。

见代码:

#include<iostream>
#include<cmath>
using namespace std;
int n,ans=0,a[1005][1005];
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=2;i<=n;i++)
        for(int j=1;j<=i;j++)
       a[i][j]+=max(a[i-1][j],a[i-1][j-1]);
    for(int i=1;i<=n;i++)
    ans=max(ans,a[n][i]);
    cout<<ans;
    return 0;
}

法二:逆推。由下到上相加,输出第一层即可。

见代码*2:

#include<iostream>
#include<cmath>
using namespace std;
int n,a[1001][1001];
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-1;i>=1;i--)
        for(int j=1;j<=i;j++)
            a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
    cout<<a[1][1];
    return 0;
}

IOI神题,当然是DP好题。所以:

好题哉!!!

原文地址:https://www.cnblogs.com/qing1/p/11133195.html