动态规划—数字三角形
动态规划——数字三角形
题目描述
请编一个程序根据展示出的三角形,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。
每一步可沿左斜线向下或右斜线向下走;
三角形行数小于等于100;
三角形中的数字为整数;
输入描述
第一行为N,表示有N行
后面N行表示三角形每条路的路径权
输出描述
路径所经过的数字的总和最大的答案
样例
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
30
样例解析
7 -> 3 -> 8 -> 7 -> 5=30
动态规划
1.三角形数组存储方法
二维数组,双层循环,
for(int i=1;i<n;i++){
for(int j=0;j<i+1;j++){
}
}
2.错误思路:
每次找下面两个元素的最大值,以此类推
(错误)代码:
f[i][j]=max(s[i-1][j],s[i-1][j-1]);
反例:
如果另一条路下面有一个非常大的,就不合适了
3
1 4
1000 9 4
很明显,就是错误的
3.正确思路:
递推关系式,用另一个数组f表示当前状态,即
f[i][j]=max(f[i-1][j],f[i-1][j-1])+s[i][j];
#include <bits/stdc++.h> using namespace std; int main(){ int n,maxx=-1; cin>>n; int s[101][101]; int f[101][101]; long long sum=0; for(int i=0;i<n;i++){ for(int j=0;j<i+1;j++){ cin>>s[i][j]; } } f[0][0]=s[0][0]; for(int i=1;i<n;i++){ for(int j=0;j<i+1;j++){ f[i][j]=max(f[i-1][j],f[i-1][j-1])+s[i][j]; } } for(int j=0;j<n;j++){ if(maxx<f[n-1][j]){ maxx=f[n-1][j]; } } cout<<maxx; return 0; }