【模版】数字塔从上到下所有路径中和最大的路径
写在前面
感觉每次都使用MaxSize大小的数组造成了很大空间的浪费
但是企图用int a[n][n];
的方式得到适合大小的数组是不现实的 别问我怎么知道的
一个想法是动态创建二维数组
另一个想法是用vector重写
以后慢慢实现吧 咕咕咕
模版
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MaxSize 1010 //注意依题修改数组大小
using namespace std;
int n, q; //塔深 问题塔深
int a[MaxSize][MaxSize]; //存放数字塔
int MNIRA(int a[][MaxSize], int q){ //MinNumberInRotateArray
//从上到下dp的优势在于可达塔的任意一层而终止求出当前最大路径和
int dp[q]; //依据塔底长度建立dp数组 存放当前最大路径和
dp[0] = a[0][0]; //初始化第一个最大路径为塔尖值
for (int i = 1; i < q; i++){
for (int j = i; j >= 0; j--){
if (j == i) dp[j] = dp[j-1] + a[i][j]; //塔层末尾值只能选择左上方元素
else if (!j) dp[j] += a[i][0]; //塔层首位值只能选择正上方元素
else dp[j] = max(dp[j], dp[j-1]) + a[i][j];
//中间值选择正上方和左上方元素最大值
}
} //最后dp数组存放每种路径的最大路径和
int Max = dp[0];
for (int i = 1; i < q; i++) Max = max(Max, dp[i]); //取出最大路径和
return Max;
}
int main() {
scanf("%d%d", &n, &q);
for (int i = 0; i < n; i++)
for (int j = 0; j <= i; j++)
scanf("%d", &a[i][j]); //存放数字塔
printf("%d\n", MNIRA(a, q)); //数字塔从上到下所有路径中和最大的路径
return 0;
}
测试数据
输入:
5 4
3
1 5
8 4 3
2 6 7 9
6 2 3 5 1
输出:
20
输入:
5 5
3
1 5
8 4 3
2 6 7 9
6 2 3 5 1
输出:
25