yzoj 1201数字三角形3题解

题意

如下图所示为一个数字三角形:

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

请编程计算从顶至底部某处的一条路径,使该路径所经过的数字的总和最大。约定:

(1)每一步可沿直线向下或右斜线向下走;

(2)1<=三角形行数<=100;

(3)三角形中的数字为整数不超过整型,保证结果也不超过整型。

(4)要求必须经过第n/2行、第n/2列这个位置。

一道简单的dp题,我们可以发现在n/2行以后n/2列左边的数是不会被用到的,也就是说我们可以分步dp,将n/2行特判即可

#include<bits/stdc++.h>
using namespace std;
int n,x,y,a[110][110],ans=-1;
int main(){
   scanf("%d",&n);
   x=n/2,y=n/2;
   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){
       if(i<=x){
           for(int j=1;j<=i;++j){
               a[i][j]=max(a[i-1][j]+a[i][j],a[i-1][j-1]+a[i][j]);
           }
       }
       else{
           if(i==x+1){
               a[i][y]=a[x][y]+a[i][y];
               a[i][y+1]=a[x][y]+a[i][y+1];
           }
           else{
               for(int j=y;j<=i;++j){
                   a[i][j]=max(a[i-1][j]+a[i][j],a[i-1][j-1]+a[i][j]);
               }
           }
       } 
   }
   for(int i=y;i<=n;++i) ans=max(ans,a[n][i]);
   printf("%d",ans);
   return 0;
}

猜你喜欢

转载自www.cnblogs.com/donkey2603089141/p/11414860.html