1. 程式人生 > >POJ 3176 Cow Bowling 保齡球 數塔問題 DP

POJ 3176 Cow Bowling 保齡球 數塔問題 DP

Cow Bowling
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 14044 Accepted: 9310

Description

The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard bowling-pin-like triangle like this: 

          7



        3   8



      8   1   0



    2   7   4   4



  4   5   2   6   5
Then the other cows traverse the triangle starting from its tip and moving "down" to one of the two diagonally adjacent cows until the "bottom" row is reached. The cow's score is the sum of the numbers of the cows visited along the way. The cow with the highest score wins that frame. 

Given a triangle with N (1 <= N <= 350) rows, determine the highest possible sum achievable.

Input

Line 1: A single integer, N 

Lines 2..N+1: Line i+1 contains i space-separated integers that represent row i of the triangle.

Output

Line 1: The largest sum achievable using the traversal rules

Sample Input

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

Sample Output

30

Hint

Explanation of the sample: 

          7

         *

        3   8

       *

      8   1   0

       *

    2   7   4   4

       *

  4   5   2   6   5
The highest score is achievable by traversing the cows as shown above.

Source


題意:

從數塔的第一層走到最底層,但只能沿對角線走,求路徑上的數的和的最大值。

分析:

從最底層向上考慮,路徑上的和的大小取決於直接取決於下面兩個數的大小。因而採用自頂向上方法,逐步向上走,走到最頂層,每次都選擇最大的和,這樣最後的結果就儲存在了最頂層。

狀態轉移方程:dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+A[i][j];

程式碼:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAX_N = 400;
int dp[MAX_N][MAX_N];
int N, A[MAX_N][MAX_N];
void solve() {
    memset(dp, 0, sizeof(dp));
    for(int i = 1; i <= N; i++) dp[N][i] = A[N][i];
    for(int i = N-1; i >= 1; i--)
        for(int j = 1; j <= i; j++)
            dp[i][j] = A[i][j]+max(dp[i+1][j], dp[i+1][j+1]);
    printf("%d\n", dp[1][1]);
}
int main() {
    while(~scanf("%d", &N)) {
        for(int i = 1; i <= N; i++) 
            for(int j = 1; j <= i; j++)
                scanf("%d", &A[i][j]);
        solve();
    }
    return 0;
}


相關推薦

POJ 3176 Cow Bowling 保齡球 問題 DP

Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14044 Accepted: 9310 D

POJ 3176 Cow Bowling (簡單dp——問題)

題意:其實就是數塔問題,找出一條加和最大的路徑,輸出最大和; 題解:data[i][j]=max(data[i-1][j],data[i-1][j-1])+data[i][j];        

POJ-3176 Cow Bowling

efault tar rsa when def represent amp tin n+1 Language: Default Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Su

3176 Cow Bowling解題報告(求三角形最大路)

社團裡以前做過。 #include<iostream> #include<string.h> using namespace std; int n; int dp[400][

poj3176Cow Bowling——dp

Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16987 Accepted: 11323 Description The cows d

hdu 2084 dp 動態規劃

lan 必須 次循環 AC 如果 sin set main turn 開始動態規劃的學習了,先是比較基礎的,很金典的數塔。附上題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=2084 這題的狀態轉移方程是 dp[i][

HDU 1176 免費餡餅(DP

免費餡餅 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s):

POJ-2184 Cow Exhibition 【動態規劃DP+01揹包變換】

題目傳送門 題目:共有N頭牛,接下來N行是每頭牛的智商和情商,從這些牛中任意選取若干頭牛,使得牛的智商和+情商和最大,同時智商和(TS),情商和(TF)都不小於0。 題解:以智商作為容量,求前i頭牛在智商為j的情況下的最大情商 。因為有負數,所以容量擴大100000,修改dp陣

hdu 2084 (DP)

Problem Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Input

HDU dp

Problem Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Inp

HUD 1257 最少攔截系統 / HDU 2084 (DP)

這個星期進入DP專題。 先是基本概念。。(摘抄課件,我自重= =) 動態規劃(Dynamic Programming, DP)是解決某一類問題的一種方法,是分析問題的一種途徑,而不是一種特殊演算法(如線性規劃是一種演算法)。因此,在學習動態規劃時,除了對基本概念和方法正確地理解外,應以豐富的想象力去建

hd 2084 (dp)

 原題連結 #include<stdio.h> int main() { int a[110][110],t,n,i,j; while(scanf("%d",&t)!=EOF) { while(t--) {

——DP演算法

在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 動態規劃問題 顯然動態轉移方程為:dp[i][j]=max(dp[i+1]

HD 2048 DP(簡單遞推)

Problem Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Inp

HDU 2084 dp

數塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 43433    Accepted Submissio

POJ 3176(動態規劃:問題)

數塔問題,比較基礎。 #include<iostream> #include<cstdio> #include<algorithm> using namespa

POJ Cow Bowlingdp

Description The cows don’t use actual bowling balls when they go bowling. They each take a numb

數字三角形/問題(DP入門題)

cstring scan iostream 動態規劃 bubuko 規劃 pri 技術分享 輸入 有形如下圖所示的數塔,從頂部出發,在每一結點可以選擇向左走或是向右走,一起走到底層,要求找出一條路徑,使路徑上的值最大。 樣例輸入: 5 13 11 8 12 7 26 6

洛谷P1216(逆向遞推遞歸+記憶化,dp

根據 初始 als out 有一個 type lse ++ 遞歸 題目鏈接:https://www.luogu.org/problemnew/show/P1216 題目很簡單,是dp和記憶化搜索的入門練手好題 有一個坑點,全為0的時候,記憶化沒初始化為其它值的話,還是暴

HDU1176 DP

很大的 數塔 space 和我 lse printf 累加 最大 數據 看了大牛的代碼後恍然大悟,然後自己開始寫,WA了一下午! 這裏有兩個坑,讓我找了一下午! AC代碼: #include <iostream>#include <stdio.h>#