poj 1163

题目大意:

输入一个整数n,输入一个n行三角形,每行n个数,从最顶数字出发,每次只能加整下方或正下方右边那个数,一直加到最后一行,让你求加到最大一行的最大值并输出;

基本思路:

1.记忆性数组(dp)+递归;

2.递推型动态规划;

代码1如下:

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=100+10;
int n,sum[maxn][maxn],a[maxn][maxn];
int max_sum(int x,int y)
{
    if(sum[x][y]!=-1) return sum[x][y];
    if(x==n) return a[x][y];
    int xx=max_sum(x+1,y);
    int yy=max_sum(x+1,y+1);
    sum[x][y]=max(xx,yy)+a[x][y];
    return sum[x][y];
}
int main()
{
    memset(sum,-1,sizeof(sum));
    cin>>n;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=i;++j)
        cin>>a[i][j];
    cout<<max_sum(1,1)<<endl;
}


代码2如下:

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=100+10;
int a[maxn][maxn],sum[maxn][maxn];
int n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=i;++j)
        scanf("%d",&a[i][j]);
    for(int j=1;j<=n;++j)
        sum[n][j]=a[n][j];
    for(int i=n-1;i>=1;i--)
        for(int j=1;j<=i;++j)
        {
            sum[i][j]=max(a[i][j]+sum[i+1][j],a[i][j]+sum[i+1][j+1]);
        }
    cout<<sum[1][1]<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值