動態規劃:數字三角形

需求

描述

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

輸出

要求輸出最大和

分析

從下朝上逆推。
arr[i][j]的數與一下行數字的最大值
相當於arr[i+1][j]與arr[i+1][j+1]中的最大值 與 arr[i][j]之和。

狀態轉移方程

max[i][j] 代表i行j列的數字到底邊的最大路徑。
這裏寫圖片描述

代碼

#include <iostream>
#include <algorithm>
using namespace std;
int arr[101][101];
int main() {
  // freopen("f:\\data.txt", "r", stdin);
  int N;
  cin >> N;
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= i; j++) {
      cin >> arr[i][j];
    }
  }
  int* res = arr[N];
  for (int i = N - 1; i >= 1; i--) {
    for (int j = 1; j <= i; j++) {
      res[j] = arr[i][j] + max(res[j], res[j + 1]);
    }
  }
  cout << *max_element(res, res + N) << endl;
  res = NULL;
  return 0;
}

測試

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章