数字三角形状态转移方程(由底层向顶层):
a[i][j]=max(a[i+1][j+1],a[i+1][j])+a[i][j](数组a为输入存储数组,n为层数,同时也是列数,a[i][j]表示该点到底层的最大权值之和(即最长路径))
1.由底层向顶层推时最底层到底层的权值是它本身,所以从n-1层开始推
2.n-1层的每个点到底层的最大权值为----该点权值+max(下方点的权值,右下方点的权值)
3.n-2,n-3,n-4层每个点的道理亦是如此,直到推到第一层即是答案
e.g.
0 i 7
1 i 3 8
2 i 8 1 0
3 i 2 7 4 4
4 i 4 5 2 6 5
j j j j j
0 1 2 3 4
代码如下:
#include<iostream>
using namespace std;
int main() {
int n;
cin>>n;
int a[n][n];
for(int i=0; i<n; i++) {
for(int j=0; j<=i; j++)
cin>>a[i][j];
}
for(int i=n-2; i>=0; i--) {
for(int j=0; j<=i; j++) {
a[i][j]=a[i][j]+max(a[i+1][j],a[i+1][j+1]);
}
}
cout<<a[0][0];
return 0;
}
京公网安备 11010502036488号