问题描述
从顶部出发,走到底层,找出一条路径使得数字和最大。
代码实现
#include <stdio.h>
#include <iostream>
using namespace std;
int dtower(int** a, int** s, int n) {
//cout << "dtower" << endl;
int i, j;
for (j = 0; j <= n; j++) {
s[n][j] = a[n][j];
//cout << s[n][j] << endl;
}
for (i = n - 1; i >= 0; i--)
for (j = 0; j <= i; j++) {
if (s[i + 1][j] >= s[i + 1][j + 1])
s[i][j] = a[i][j] + s[i + 1][j];
else
s[i][j] = a[i][j] + s[i + 1][j + 1];
}
cout << s[0][0] << endl;
return s[0][0];
}
void Traceback(int** a, int** s, int i, int j,int n) {
if (i == n)
cout << i << "," << j << endl;
else {
cout << i << "," << j << endl;
if (s[i][j] == a[i][j] + s[i + 1][j])
Traceback(a, s, i + 1, j,n);
else
Traceback(a, s, i + 1, j + 1,n);
}
}
int main(){
int i = 0, j = 0;
int s[5][5] = { 0 };
int a[5][5] = { {30},{23,21},{20,13,10},{7,12,10,22},{4,5,2,6,5} };
int n = 4;
int *pa[5];
int *ps[5];
pa[0] = &a[0][0];
pa[1] = a[1];
pa[2] = a[2];
pa[3] = a[3];
pa[4] = a[4];
ps[0] = &s[0][0];
ps[1] = s[1];
ps[2] = s[2];
ps[3] = s[3];
ps[4] = s[4];
dtower(pa, ps, n);
Traceback(pa, ps, i, j, n);
return 0;
}
写的时候遇到一个问题,二维数组的传参方式,查了些资料发现还蛮麻烦的,此处根据函数原型里传入二级指针选择了建立指针数组的方式。
二维数组的传参方法
- 形参为二维数组并给定第二维长度。
- 形参为指向数组的指针并给出数组长度。
- 形参为指针的指针。此方法实参必须为指针,而不能为数组名。