在矩形找路径输出最大值
输入
4 4
0 1 0 0
2 0 0 5
9 0 100 0
0 11 0 0
输出
111
#include <stdio.h>
#include <string.h>
#define N 10
int map[N][N];
int find(int m, int n);
void input(int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &map[i][j]);
}
}
}
int max(int a, int b){
return a > b ? a : b;
}
int find(int m, int n) {
//当前只有一个位置
if (m == 0 && n == 0) {
return map[m][n];
}
//当前位置在矩形的第一行
if (m == 0) {
return map[m][n] + find(m, n-1);
}
//当前位置在矩形的第一列
if (n == 0) {
return map[m][n] + find(m-1, n);
}
//其他 情况
return map[m][n] + max(find(m-1, n), find(m, n-1));
}
int main(void) {
int m, n;
scanf("%d%d", &m, &n);
input(m, n);
int res = find(m-1, n-1);
printf("%d\n", res);
return 0;
}
在三角形找路径输出最大值
输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
30
#include <stdio.h>
#define N 10
int map[N][N];
int m;
void input(){
//输入三角形的行数 存在二维数组中
scanf("%d", &m);
for (int i = 0; i < m; i++) {
for(int j = 0; j <= i; j++) {
scanf("%d", &map[i][j]);
}
}
}
int max(int a, int b){
return a > b ? a : b;
}
int findPass(int m, int n){
//当三角形只有一行时
if (m == 0 && n == 0) {
return map[m][n];
}
//当前位置为三角形的竖直直角边中时 位置来源只有上层元素
if(n == 0) {
return map[m][n] + findPass(m-1, n);
}
//当前位置为三角形的斜边时 位置来源只有斜上方元素
if (m == n) {
return map[m][n] + findPass(m-1, n-1);
}
//其他情况 位置来源有正上方元素 和斜上方元素
return map[m][n] + max(findPass(m-1, n), findPass(m-1, n-1));
}
int find(int m) {
int res = 0;
//从三角形底部的元素作为出口 遍历找出最大数值
for (int i = 0; i < m; i++) {
int num = findPass(m-1, i);
if (res < num){
res = num;
}
}
return res;
}
int main (void) {
input();
int res = find(m);
printf("%d\n", res);
return 0;
}