1. 程式人生 > >酌一杯清酒

酌一杯清酒

 數字三角形

問題描述  (圖3.1-1)示出了一個數字三角形。 請編一個程式計算從頂至底的某處的一條路
  徑,使該路徑所經過的數字的總和最大。
  ●每一步可沿左斜線向下或右斜線向下走;
  ●1<三角形行數≤100;
  ●三角形中的數字為整數0,1,…99;


  .
  (圖3.1-1)輸入格式  檔案中首先讀到的是三角形的行數。

  接下來描述整個三角形輸出格式  最大總和(整數)樣例輸入5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5樣例輸出30

一道動態規劃可以做的吧,核心就是 dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+dp[i][j];

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
int main()
{
	int dp[105][105];
	int n;
	while(scanf("%d",&n)==1){
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)
		  for(int j=1;j<=i;j++)
		     scanf("%d",&dp[i][j]);
		for(int i=1;i<=n;i++)
		   for(int j=1;j<=i;j++)
		     dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+dp[i][j];
	    int sum=dp[n][1];
		for(int i=2;i<=n;i++)
		  if(sum<dp[n][i])
		    sum=dp[n][i];
	    printf("%d\n",sum);
	} 
	return 0;
}