Cow Bowling

Cow Bowling

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.

C++编写:

此题是属于动态规划,首先这道题我们看下面这图,这样每个元素对应得非常清晰,这样更加容易理解。并且这个题有个隐含条件,就是每一行的元素个数其实就等于其所在行数。

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

此题我在初始化记忆化数组的时候走入一个误区,用了下面这行代码

fill(dp,dp+N,0)

提交出现CE,后面一想其实初始化N个元素固然没错,但是这样做并没有初始化我们所想要被初始化的那N个元素,所以改成了用memset()函数,不过要用fill()函数来初始化也是可以实现的,只是需要一个循环语句而已,相对就麻烦了点,并且memset()这个函数真的好用,不过这个函数水还是很深,有兴趣的可以去了解一下,那么下面是此题代码:

#include<iostream>
#include<cstring>
using namespace std;
const int MAX_N=355;

int N;
int value[MAX_N][MAX_N];      //记录每个点的值
int dp[MAX_N][MAX_N];         //记录走到每个点的最大值

void solve()
{
    for (int i=0;i<N;i++)           //读入数据
    {
        for (int j=0;j<=i;j++)
            cin>>value[i][j];
    }
 
    memset(dp,0,sizeof(dp));        //初始化记忆化数组
    for(int i=0;i<N;i++)                   //得到从顶端走到每个点的最大值
    {
        for(int j=0;j<=i;j++)
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+value[i][j];           
    }

    int max=dp[N-1][0];
    for (int i=1;i<N;i++)            //得到最后一行的最大值
    {
        if (max<dp[N-1][i]) 
            max=dp[N-1][i];
    }
    cout<<max<<endl;        
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>N;
    solve();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值