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;
}
原文地址:https://www.cnblogs.com/donkey2603089141/p/11414860.html