1. 程式人生 > >數字三角形-poj

數字三角形-poj

ber else return int poj 一個 style 思想 space

題目要求:

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

  在上面的數字三角形中尋找在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或右下走。只需要求出這個最大和即可,不必給出具體路徑。
  三角形的行數大於1小於等於100,數字為 0 - 99

輸入格式:
5 //三角形行數。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

解題思路:

  用二維數組存放數字三角形

  D[r][j] //表示第i行第j個元素的數值;

  MaxSum(i,j) //表示從根部到第i行最大路徑的,所有數值的最大和;

用遞歸的思想,在D(i,j)位置,下一個能走的位置為D(i+1,j)和D(i+1,j+1),進行遞歸

  MaxSum(i,j)=max(MaxSum(i+1,j),MaxSum(i+1,j+1))+D[i][j];

代碼:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
using namespace std;
int N;
#define  Max 100
int number[Max][Max];

int Maxnum(int x,int y){return x>y?x:y;}
int  Max_road_sum(int i,int
j) { if(i==N) return number[i][j]; else { int num1=Max_road_sum(i+1,j); int num2=Max_road_sum(i+1,j+1); return Maxnum(num1,num2)+number[i][j]; } } int main() { int i,j; cin>>N; for(i=1;i<=N;i++) { for(j=1;j<=i;j++) cin
>>number[i][j]; } cout<<Max_road_sum(1,1)<<endl; return 0; }

數字三角形-poj