输入一个数字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,要考虑边界条件。
而这道题要求的是最大路径,是从下到上求的,用的是一维数组,也要考虑边界条件,各种下标的对应的转换就特别麻烦了。我是看了一眼别人的思路自己写了出来。
标签:arr,row,23,int,笔试,路径,真题,col,size From: https://www.cnblogs.com/uacs2024/p/18077659