这是动态规划很经典的一个问题
就是一个三角形类似这样:
2
3 4
输出顶点的到底部的最大和,限制条件元素只能左下或者右下走
例如:上述这个三角形,这个输出就是6
解决方法:动态规划
定义的dp数组的小只需要和最后一行的元素个数相等即可。例如最后一行输入的数据最后一行是10个元素,我就只需要定义一个dp[10]。
-
首先我们可以用一个二维数组来存储这个三角形
-
那么第一行就是一个元素,第n行就是n个元素
-
然后我们遍历每一行的时候就用dp数组来存储本行的最大值,例如最后一行的元素它们本身,然后倒数第二行就是Max(dp[j]+triangle[i][j] , dp[j+1]+triangle[i][j])。这个找个例子就好理解
-
从最底层开始往上就比较容易理解啦
例子:
2
3 4
5 6 4
这里有这样一个三角形,那么我的dp数组的初值分别为5 6 4
然后我们遍历到倒数第二行我们的dp数组就更新为max(5+3,6+3) max(4+6,4+4)即9 10最后一个元素不用管它,然后我们遍历最后一行更新dp为12,dp[0]就是我们想要的数据了!
#include <iostream>
using namespace std;
int dp[10];
int Max(int x,int y);
//求出x,y点到三角形底端的一条累加和最大的路径
int Slove(int x,int y,int triangle[10][10],int n){
for(int i=n-1;i>=0;i--){
for(int j=0;j<=i;j++){
//当处于第n行时,即最后一行时直接赋值
if(i==n-1) dp[j] = triangle[n-1][j];
// 处于其他行时就是从它左边上来的最大值加上他自己和它右边上来的最大值加它自己之间的最大值咯
else dp[j] = Max(dp[j]+triangle[i][j] , dp[j+1]+triangle[i][j]);
}
}
return dp[0];
}
int Max(int x,int y){
if(x>y) return x;
return y;
}
int main(){
int triangle[10][10] = {0};
int n;
cin >> n;
// n行数据,每行数据个数递增1
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cin>>triangle[i][j];
}
}
cout << Slove(1,1,triangle,n);
return 0;
}
不懂的话可以直接我哦!小菜鸡帮你解答。