1. 程式人生 > >poj3176Cow Bowling數塔——dp

poj3176Cow Bowling數塔——dp

Cow Bowling
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 16987 Accepted: 11323
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.

樹狀dp一點都看不懂,然後就想把dp學一下。。。感覺自己也是萌萌噠。

寒假的時候看了dp 的概念。。。然而並沒有什麼卵用。現在做做題目,好像找到了訣竅。
dp我覺得就是一層一層的深入進去。在當前這個狀態找到前一個狀態的解。感覺很厲害。如果還有碰到題目再加進去,做一個dp的總結,現在只是有點感覺。。。

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
#include<map>
using namespace std;
int dp[500][500];
int main()
{   
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<=i;j++)
            cin>>dp[i][j];
        }
        for(int i=n-1;i>=0;i--)
        {
            for(int j=0;j<=i;j++)
            {
                dp[i][j]=dp[i][j]+max(dp[i+1][j+1],dp[i+1][j]); //你現在這個節點的值加上你下面那個節點的最優解
            }
        }
        cout<<dp[0][0]<<endl;
    }
}