1. 程式人生 > >10303 數字三角(動態規劃)

10303 數字三角(動態規劃)

10303 數字三角

時間限制:1000MS  記憶體限制:65535K
提交次數:117 通過次數:56

題型: 程式設計題   語言: C++;C;VC;JAVA

Description

問題描述:給定一個由n行數字組成的數字三角形,如下圖所示。試用動態規劃演算法,計算出從三角頂部至底部的一條路徑,使得該路徑經過的數字總和最大。

注意每個數字只能走向下一行左邊或右邊的數字,而不能跳躍的走。
         7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5



輸入格式

第一行是數字三角的行數n,1<=n<=100。接下來n行是數字三角各行中的數字,所有數字在0~99之間。


輸出格式

輸出兩行,第一行是計算出的最大路徑的和值,第二行是該路徑上的數字。若有多條路徑,靠右的路徑優先(即僅僅輸出靠右的路徑即可,無需多條路徑都輸出)。


如:
Input: 
5
7
3 8
8 1 6
2 7 4 4
4 5 2 4 5
有兩條路徑:7-3-8-7-5和7-8-6-4-5都為30,由於後者靠右,因此僅輸出後者。
Output: 
30
7 8 6 4 5


輸入樣例

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


輸出樣例

30
7 3 8 7 5


提示



作者

zhengchan

我的實現程式碼

#include <iostream>
#include <cmath>
#include <string.h>

using namespace std;

int main()
{
    int n;
    cin >> n;

    int arr[n+1][n+1];
    int res[n+1][n+1];
    
    memset(arr, -1, sizeof(int));
    memset(res, -1, sizeof(int));
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {

            cin >> arr[i][j];
        }
    }
    
    // 初始化res結果陣列
    for (int i = 1; i <= n; i++) {
        res[n][i] = arr[n][i];
    }
    
    for (int i = n - 1; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            // 動規填表
            res[i][j] = max(res[i+1][j], res[i+1][j+1]) + arr[i][j];
        }
    }
    
    /*
    // 列印res陣列
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            
            cout << res[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
    */
    
    
    cout << res[1][1] << endl;//最大路徑和值
    
    // 找出靠右路徑
    int y = 1;
    cout << arr[1][y] << " ";//頂部最大
    for (int i = 2; i <= n; i++) {
        // 從上往下找,只需要比較 y 和 y+1,相應輸出 “最大值下標對應的” 原值
        if (res[i][y] <= res[i][y+1]) {
            cout << arr[i][y+1] << " ";
            y = y+1;//更新y
        }else{
            cout << arr[i][y] << " ";
        }
    }
    
    cout << endl;
    return 0;
}
/*
 
 5
 7
 3 8
 8 1 6
 2 7 4 4
 4 5 2 4 5
 
 8
 89
 56 78
 67 43 93
 45 67 94 14
 64 50 24 42 57
 94 15 42 34 17 68
 78 91 79 46 86 46 98
 37 59 86 97 54 75 89 54
 
 */


相關推薦

10303 數字三角動態規劃

10303 數字三角 時間限制:1000MS  記憶體限制:65535K 提交次數:117 通過次數:56 題型: 程式設計題   語言: C++;C;VC;JAVA Description 問題描述:給定一個由n行數字組成的數字三角形,如下圖所示。試用動態規

數字金字塔動態規劃

問題描述: 觀察下面的數字金字塔,查詢從最高點到底部任意結束的路徑,使路徑經過的數字之和最大。每一步可以從當前點走到左下方的點或者右下方的點。                          13                    11         8      

數字三角形動態規劃poj1163

問題描述 有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數,從第一行的數開始,每次可以往左下和右下走一格,直到走到最下行,把沿途經過的數全部加起來,如何才能使這個和最大?? 狀態轉移方程由來的分析 需要用抽象的

python--lintcode109.數字三角形動態規劃

描述 給定一個數字三角形,找到從頂部到底部的最小路徑和。每一步可以移動到下面一行的相鄰數字上。 如果你只用額外空間複雜度O(n)的條件下完成可以獲得加分,其中n是數字三角形的總行數。 您在真實的面試中是否遇到過這個題?  是 樣例 比如,給出下列數字三角形: [

演算法訓練 數字三角形 動態規劃

演算法訓練 數字三角形  時間限制:1.0s   記憶體限制:256.0MB問題描述  (圖3.1-1)示出了一個數字三角形。 請編一個程式計算從頂至底的某處的一條路  徑,使該路徑所經過的數字的總和最

Vijos P1218 數字遊戲動態規劃,環形DP

丁丁最近沉迷於一個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共n個),你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到一個數k。遊戲的要求是使你所得的k最大或

凸多邊形最優三角剖分動態規劃

#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; const int N=7; int Weight(int **w,int a,int b,int c) {     r

hud2059龜兔賽跑動態規劃

n+1 動物 include output script text sam 起跑線 other 龜兔賽跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T

ship動態規劃

動態規劃 輸出 一個 子序列 升序 端點 如果 2個 長度 (ships.pas/c/cpp) 來源:《奧賽經典》(提高篇)【問題描述】PALMIA國家被一條河流分成南北兩岸, 南北兩岸上各有N個村莊。 北岸的每一個村莊有一個唯一的朋友在南岸,且他們的朋友村莊彼此不同。每一

計蒜客--爬樓梯 動態規劃

tle nbsp vector main long 3.1 false n) 方法 假設你現在正在爬樓梯,樓梯有 nn 級。每次你只能爬 11 級或者 22 級,那麽你有多少種方法爬到樓梯的頂部? 輸入格式 第一行輸入一個整數 n(1\leq n \leq 50)n

【算法學習】雙調歐幾裏得旅行商問題動態規劃(轉)

png .com 16px 我們 pan 子結構 最小 而且 復雜度 雙調歐幾裏得旅行商問題是一個經典動態規劃問題。《算法導論(第二版)》思考題15-1和北京大學OJ2677都出現了這個題目。 旅行商問題描述:平面上n個點,確定一條連接各點的最短閉合旅程。這個解的一般形式

動態規劃4977:怪盜基德的滑翔翼

受傷 問題 while 超級 ret 輸入數據 col std namespace 描述 怪盜基德是一個充滿傳奇色彩的怪盜,專門以珠寶為目標的超級盜竊犯。而他最為突出的地方,就是他每次都能逃脫中村警部的重重圍堵,而這也很大程度上是多虧了他隨身攜帶的便於操作的滑翔翼。 有一天

動態規劃4978:寵物小精靈之收服

能夠 出了 哪些 整數 範圍 -- power 必須 方程 描述 寵物小精靈是一部講述小智和他的搭檔皮卡丘一起冒險的故事。 一天,小智和皮卡丘來到了小精靈狩獵場,裏面有很多珍貴的野生寵物小精靈。小智也想收服其中的一些小精靈。然而,野生的小精靈並不那麽容易被收服。對於每一個野

動態規劃6049:買書

動態 種類 blog namespace iostream sin += out bsp 描述 小明手裏有n元錢全部用來買書,書的價格為10元,20元,50元,100元。 問小明有多少種買書方案?(每種書可購買多本) 輸入 一個整數 n,代表總共錢數。(0 <=

decode-ways動態規劃

mine nta sage 方法 表示 subst nco ssa 嘗試 題目描述   A message containing letters fromA-Zis being encoded to numbers using the following map

Triangle動態規劃

ret from 新的 選擇 位置 ive 一個 top 原理 題目描述 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent

【WC2001】【cogs358】高性能計算機動態規劃

結束 輸入輸出 計算機 stdout 所有 主存 時間 span 要花 【WC2001】【cogs358】高性能計算機(動態規劃) ##題面 【問題描述】 現在有一項時間緊迫的工程計算任務要交給你——國家高性能並行計算機的主管工程師——來完成。為了盡可能充分發揮並行計算機的

【BZOJ1899】午餐動態規劃

需要 記錄 表示 列隊 其中 truct ble read namespace 【BZOJ1899】午餐(動態規劃) 題面 BZOJ 題解 我太弱了 這種\(dp\)完全做不動。。 首先,感性理解一些 如果所有人都要早點走, 那麽,吃飯時間長的就先吃 吃飯時間短的就晚點吃

【BZOJ2998】Problem A動態規劃

gpo pre com space main ostream 最大 == while 【BZOJ2998】Problem A(動態規劃) 題面 BZOJ 題解 一個人的成績範圍可以確定為一個區間 這樣就變成了 選擇若幹區間,不重合, 每個區間有個權值,求最大權值和 這樣就可

ALGO-3 K好數動態規劃

con 正整數 const 方程 自然 自然數 include 由於 can 問題描述 如果一個自然數N的K進制表示中任意的相鄰的兩位都不是相鄰的數字,那麽我們就說這個數是K好數。求L位K進制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、20