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