uacs2024

导航

23笔试真题:最长路径问题

输入一个数字n表示层数,在输入数字来表示三角形,要求三角形求解从顶到低的最长路径。

    7
   4 2
  1 6 0
 2 4 7 5
2 4 6 7 5

从第一层的 7 出发,走到第五层,求出经过路径和最长的路径和。要求使用递归与递推两种方法,并且按照下面的输入与输出设计程序。从上一层向下一层走的时候,只能走两边的路。如第三层的 6 ,那么下一层只能选择第四层的 4 或者 7 。

输入:

5
7 4 2 1 6 0 2 4 7 5 2 4 6 4 5

输出:

30
7
4 2
1 6 0
2 4 7 5
2 4 6 7 5

30
30
23 21
11 19 13
6 10 13 10
2 4 6 4 5

题目只给了这些,要求写函数体,补充main函数

#include <iostream>
using namespace std;

void print(int *arr, int size);
int *input(int size);
int digui(int *arr, int size, int row, int col);
int ditui(int *arr, int size);

int main(){
 
  return 0;
}

代码我这里为了方便没有写函数声明的形式

#include <iostream>
using namespace std;

int *input(int size){
    int *arr = new int[size];
    for(int i=0;i<size;i++){
        cin>>arr[i];
    }
    return arr;
}
void print(int *arr,int size){
    int index=0;
    for(int n=1;n <=size;n++){
        for(int i = 0;i < n;i++){
            cout << arr[index++] << " ";
        }
        cout << endl;
    }
    /*//这部分是我自己写的,搞复杂了
    int total = size*(size+1)/2;
    int now=0,cengshu=1,count=0;
    while(now<total){
        cout << arr[now] << " ";
        count++;now++;
        if(count == cengshu){
            cout << endl;
            count=0;
            cengshu++;
        }
    }*/
}

int digui(int *arr,int size,int row,int col){   //arr,size,0,0
    if(row == size) return 0;

    int num = arr[row*(row+1)/2+col];
    int left = digui(arr,size,row+1,col);
    int right = digui(arr,size,row+1,col+1);

    return left > right ? (num+left) : (num+right);
}

//这个用void也行
int ditui(int *arr,int size){ int col = size-1; int total = size*(size-1)/2-1; int count = 0; for(int i = total;i>=0;i--){ int num = arr[i+col] > arr[i+col+1] ? arr[i+col] : arr[i+col+1]; arr[i] = arr[i] + num; count++; if(count == col){ col--; count=0; } } return 0; } int main(){ int size;cin>>size; int *arr;arr = input(size*(size+1)/2); cout << digui(arr,size,0,0) << endl; print(arr,size); cout << endl; ditui(arr,size); cout << arr[0] << endl; print(arr,size); delete arr; }

之前做过 leetcode120. 三角形最小路径和 ,leetcode这道要求的是最小路径,是从上到下求的,用的是二维vector,要考虑边界条件。

而这道题要求的是最大路径,是从下到上求的,用的是一维数组,也要考虑边界条件,各种下标的对应的转换就特别麻烦了。我是看了一眼别人的思路才自己写出来。

 

posted on 2024-03-16 21:25  ᶜʸᵃⁿ  阅读(19)  评论(0编辑  收藏  举报