题意:有一个n行的矩阵,第一行有一个数,每一行比上一行多一个数,从第一行开始,可以加左下或右下的数,问到最后一行的结果最大是多少。
思路:虽然是dp专题,但是还是比较像是贪心。遍历每一个数,更新其值为自身加上左上和右上中的最大值,最后比较最后一行的最大值得出答案。
代码:
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef long long ll;
ll dp[360][360];
int main()
{
ios::sync_with_stdio(false);
int n,i,j;
while(cin>>n){
memset(dp,0,sizeof dp);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>dp[i][j];
for(i=2;i<=n;i++)
for(j=1;j<=i;j++)
dp[i][j]+=max(dp[i-1][j],dp[i-1][j-1]);
ll ans=0;
for(i=1;i<=n;i++)
ans=max(ans,dp[n][i]);
cout<<ans<<endl;
}
}