题目链接:http://poj.org/problem?id=1163
1、递归思想:第一层到最底层的最优路径可以分解为:第一层到第二层来,再加上第二层的最优路径
#include <algorithm> #include <stdio.h> #define MAX 101 using namespace std; int maps[MAX][MAX]; int n; int Sum(int i,int j) { if(i==n) return maps[i][j]; else return max(Sum(i+1,j),Sum(i+1,j+1))+maps[i][j]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { scanf("%d",&maps[i][j]); } } printf("%d\n",Sum(1,1)); return 0; }
2、通过记录表记录每一个点的最优解,从而避免重复计算。
Memory: 332KTime: 0MSLanguage: C++Result: Accepted
#include <iostream> #include <algorithm> using namespace std; const int maxn=105; int n; int maps[maxn][maxn]; int maxsum[maxn][maxn]; int Maxsum(int i,int j) { int x,y; if(maxsum[i][j]!=-1) return maxsum[i][j]; if(i==n) return maps[i][j]; x=Maxsum(i+1,j); y=Maxsum(i+1,j+1); maxsum[i][j]=max(x,y)+maps[i][j]; return maxsum[i][j]; } int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { cin>>maps[i][j]; maxsum[i][j]=-1; } } cout<<Maxsum(1,1)<<endl; return 0; }
3、递归变递推
Memory: 332KTime: 0MSLanguage: C++Result: Accepted
#include <iostream> #include <algorithm> using namespace std; const int maxn=105; int n; int maps[maxn][maxn]; int maxsum[maxn][maxn]; int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { cin>>maps[i][j]; } } for(int i=1;i<=n;i++) maxsum[n][i]=maps[n][i]; for(int i=n-1;i>=1;i--) { for(int j=1;j<=i;j++) { maxsum[i][j]=max(maxsum[i+1][j],maxsum[i+1][j+1])+maps[i][j]; } } cout<<maxsum[1][1]<<endl; return 0; }
4、空间优化,不需要用到二维记录表。
Memory: 204KTime: 0MSLanguage: C++Result: Accepted
#include <stdio.h> #include <algorithm> #define MAX 101 using namespace std; int maps[MAX][MAX]; int sum[MAX]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) scanf("%d",&maps[i][j]); } for(int i=1;i<=n;i++) sum[i]=maps[n][i]; for(int i=n-1;i>=1;i--) { for(int j=1;j<=i;j++) sum[j]=max(sum[j],sum[j+1])+maps[i][j]; } printf("%d\n",sum[1]); }
时间: 2024-10-07 23:33:19