算法学习(更新中...)

算法学习(个人学习篇,更新中...)

目录

1.数字三角形问题

2.租用游艇问题


emmmm由于本人比较懒又是写给自己看的,所以题目我就直接拍照啦。

1.题目描述如下:

 思路:第一反应是从上往下,不停找到最大值,但是由于路径有限制,每个元素只能向下向外扩展两个位置,再继续比较,些许麻烦。所以我们从下往上走(逆向思维很重要),从最后一行开始,第一个和第二个比较,找出较大的那个,与上一行他俩中间的那个数相加,这样一直比较再相加,最后可以得到4个较大的数,替换掉上一行的数,当然我们也可以再定义一个数组来存。以此类推,倒数第二行找出3个数加到倒数第三行,加啊加加到最后,加到第一行的时候就是最大值了,输出就行了。

源码(在这里我定义了一个新的数组存储得到的值):

//数字三角形问题
#include <iostream>
using namespace std;
int main()
{
    int a[100][100];
    int aMaxSum[100][100];
    int n, i, j;
    cin >> n;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
        {
            cin >> a[i][j];
        }
    }
    for(j=1; j<=n; j++)
    {
        aMaxSum[n][j] = a[n][j];
    }
    for(i=n; i>1; i--)
    {
        for(j=1; j<i; j++)
        {
            if(aMaxSum[i][j]>aMaxSum[i][j+1])
                aMaxSum[i-1][j] = aMaxSum[i][j] + a[i-1][j];
            else
                aMaxSum[i-1][j] = aMaxSum[i][j+1] + a[i-1][j];
        }
    }
    cout << aMaxSum[1][1];
    return 0;
}

2.题目描述如下:

思路:考察的是,间接花费和直接花费哪个更小。假设m[i]是从站1到站i的最小花费,那么实际上m[i] = min( m[i], m[j] + r(j, i) ) ,哪个小就取哪个。

源码:

//租用游艇问题
#include <iostream>
using namespace std;
int PickSmall(int x,int y){   //两数比较取小的
    if(x<y) return x;
    return y;
}

int main()
{
    int r[100][100];
    int m[100][100] = {0};
    int n;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        for(int j=i+1; j<=n; j++)
        {
            cin >> r[i][j];
        }
    }
    int min[n+1]={0};    //记录从第一个站点到第i个站点的最优解(最少花费)
    for(int i=2;i<=n;i++){
        min[i]=r[1][i];
        for(int j=1;j<i;j++){
            min[i]=PickSmall(min[i],min[j]+r[j][i]);
        }
    }
    cout<<min[n]<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值