题目概述:
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define maxr 1001
int num[maxr][maxr];
int dp[maxr][maxr];//定义dp[i][j]表示到第i行第j个数字的最优解
int main()
{
std::ios::sync_with_stdio(false);
int r;
cin>>r;
for(int i=1;i<=r;++i)
for(int j=1;j<=i;++j)
{
cin>>num[i][j];
}
int ans=-1000000000;
for(int i=1;i<=r;++i)
for(int j=1;j<=i;++j)
{
if(j==1)
dp[i][j]=dp[i-1][j]+num[i][j];
else if(j==i)
dp[i][j]=dp[i-1][j-1]+num[i][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+num[i][j];
if(i==r)
ans=max(ans,dp[i][j]);
}
cout<<ans<<endl;
return 0;
}
分析思路:
每一步都有三种情况:
1.如果是第一列,只能选上一行的第一列。
2.如果是最后一列,只能选上一行最后一列。
3.中间的,可以选左边也可以选右边(不过下标不是一个+1一个-1,一个-1另一个一样)