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();
}