#include<bits/stdc++.h>usingnamespace std;#define N 1005int a[N][N], r;//a:原始數據,r:行數int sumMx[N][N];//sumMx[i][j]:記錄從1,1到i,j位置的最大加和int mxVal;//最大加和intmain(){cin>>r;for(int i =1; i <= r;++i)for(int j =1; j <= i;++j)cin>>a[i][j];sumMx[1][1]= a[1][1];for(int i =2; i <= r;++i)for(int j =1; j <= i;++j){sumMx[i][j]=max(sumMx[i-1][j-1], sumMx[i-1][j])+ a[i][j];if(i == r)//求第r行的最大值{if(sumMx[i][j]> mxVal)mxVal = sumMx[i][j];}}cout<<mxVal;return0;}
解法3:逆推法
設數組sumMx[i][j]表示從底層某位置到i,j的最大加和。 從底層向上層遞推。
#include<bits/stdc++.h>usingnamespace std;#define N 1005int a[N][N], r;//a:原始數據,r:行數int sumMx[N][N];//sumMx[i][j]:記錄從底層到i,j位置的最大加和int mxVal;//最大加和intmain(){cin>>r;for(int i =1; i <= r;++i)for(int j =1; j <= i;++j)cin>>a[i][j];for(int i =1; i <= r;++i)//底層到底層的和,即為該位置的值sumMx[r][i]= a[r][i];for(int i = r -1; i >=1;--i)//從倒數第二行遍歷到第1行for(int j =1; j <= i;++j)sumMx[i][j]=max(sumMx[i+1][j], sumMx[i+1][j+1])+ a[i][j];//i,j位置的加和為其下面兩個位置的加和中的最大值加上本位置的值cout<<sumMx[1][1];//底層某位置到1,1的最大加和,即為要求的值return0;}