赞
踩
数字三角形的表示:数字三角形可以用一个二维数组表示
问题解决有两种思路顺推法、逆推法。
F[x][y]表示从(1,1)出发到达(x,y)的路径最大权值和。
向左:
F[x][y]=F[x-1,y]+A[x,y];
向右:
F[x][y]=F[x-1,y-1]+A[x,y];
边界条件:F[1][1]=A[1][1]
#include <iostream> #include <algorithm> using namespace std; const int MAXN= 1005; int A[MAXN][MAXN],F[MAXN][MAXN],n; int main() { cin >> n; for(int i = 1;i <= n;i ++) for(int j = 1;j <= i;j ++) cin >> A[i][j]; F[1][1] = A[1][1]; for(int i = 2;i <= n;i ++){ for(int j = 1;j <= i;j ++){ F[i][j]=max(F[i-1][j-1],F[i-1][j])+A[i][j]; } } int answer =0; for(int i = 1;i <= n;i ++) answer = max(answer,F[n][i]); cout << answer << endl; return 0; }
结果:
F[i][j]=max(F[i+1][j],F[i+1][j+1])+A[i][j];
边界条件: F[n][i]=A[n][i]
#include <iostream> #include <algorithm> using namespace std; const int MAXN = 1005; int A[MAXN][MAXN],F[MAXN][MAXN],n; int max(int a,int b){ if(a>b) return a; return b; } int main() { int i; cin >> n; for( i = 1;i <= n;i ++) for(int j = 1;j <= i;j ++) cin >> A[i][j]; for( i = 1;i <=n;i ++) F[n][i] = A[n][i]; for( i = n-1;i >=1;i --) for(int j = 1;j <= i;j ++) F[i][j]=max(F[i+1][j],F[i+1][j+1])+A[i][j]; cout << F[1][1] << endl; return 0; }
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。