动态规划: 数字三角形

//动态规划例题ppt p22 数字三角形 1.递归
#include<iostream>
#include<cstring>
using namespace std;
int n;
int array[5][5];

int f(int r,int j)
{
    if(r==n-1)
    {
        return array[r][j];
    }
    int num1=f(r+1,j);
    int num2=f(r+1,j+1);
    if(num1>num2)
    {
        return num1+array[r][j];
    }
    else{
        return num2+array[r][j];
    }
}
int main()
{
    cin>>n; //5
    memset(array,0,sizeof(array));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            cin>>array[i][j];
        }
    }

    cout<<f(0,0)<<endl;
    return 0;
}

 

//动态规划例题ppt p22 数字三角形 2.递归+备忘录,避免重复计算
#include<iostream>
#include<cstring>
using namespace std;
int n;
int array[5][5];
int maxsum[5][5]; //用来表示该位置有没有计算过,有就直接使用

int f(int r,int j)
{
    if(r==n-1)
    {
        return array[r][j];
    }
    if(maxsum[r+1][j]==-1)//没有就计算
    {
        maxsum[r+1][j]=f(r+1,j);
    }
    if(maxsum[r+1][j+1]==-1)
    {
        maxsum[r+1][j+1]=f(r+1,j+1);
    }
    if(maxsum[r+1][j+1]>maxsum[r+1][j])  //直接使用计算过的
    {
        return maxsum[r+1][j+1]+array[r][j];
    }
    else{
        return maxsum[r+1][j]+array[r][j];
    }
}
int main()
{
    cin>>n; //5
    memset(array,0,sizeof(array));
    memset(maxsum,-1,sizeof(maxsum));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            cin>>array[i][j];
        }
    }
    cout<<f(0,0);
    return 0;
}

 

//动态规划例题ppt p22 数字三角形 3.递推 自底向上计算最大路径,自上向下打印最终路径
#include<iostream>
#include<cstring>
using namespace std;
int array[5][5];
int array1[5][5];
int main()
{
    int n;
    cin>>n;
    memset(array,0,sizeof(array));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            cin>>array[i][j];
            array1[i][j]=array[i][j];
        }
    }

    for(int i=n-2;i>=0;i--)     //自底向上计算,可以算出最大的路径长
    {
        for(int j=0;j<=i;j++)
        {
            if(array[i+1][j]>array[i+1][j+1])//对左右两边的数字进行选择,较大的加上去
            {
                array[i][j]+=array[i+1][j];
            }
            else{
                array[i][j]+=array[i+1][j+1];
            }
            //cout<<array[i][j]<<" ";
        }
        //cout<<endl;
    }
    cout<<array[0][0]<<endl;

    cout<<"路径为:"<<array1[0][0]<<"--->";
    int m=0;
    for(int i=0;i<n-1;i++)
    {
        for(int j=m;j<=i;j++)
        {
            if(array[i+1][j]>array[i+1][j+1])
            {
               cout<<array1[i+1][j]<<"--->";
               m=j;
               break;
            }
            else{
                cout<<array1[i+1][j+1]<<"--->";
               m=j+1;
               break;
            }
        }
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_39450145

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值