题目链接:http://acm.scu.edu.cn/soj/problem.action?id=1114
---------------------------------------------------------------------------------
题意:一个三角形,只能向下或向右下走,要求得到最大值的路线。
思路:从底向上,状态转移方程为f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN = 100+10; int a[MAXN][MAXN]={0}; int f[MAXN][MAXN]={0}; int main(void){ int N= 0; scanf("%d",&N); for(int i=1;i<=N;i++){ for(int j=1;j<=i;j++){ scanf("%d",&a[i][j]); } } for(int i=1;i<=N;i++){ f[N][i] = a[N][i]; } for(int i=N-1;i>=0;i--){ for(int j=0;j<=i;j++){ f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]; } } printf("%d\n",f[1][1]); int j =1; for(int i=1;i<=N;i++){ if(f[i][j]-f[i+1][j]==a[i][j]){ printf("%d",a[i][j]); }else{ printf("%d",a[i][j]); j++; } if(i==N) printf("\n"); else printf(" "); } return 0; }