dp的关键在于找好状态方程,状态方程通俗的来说,就是你在此处的选择是由哪些东西来决定的,拿该题来说,在已知第一步的情况下,第二步只能走同一列的下一步或者沿着对角线走,然后下面的过程就是一直迭代的过程,因为状态方程不会变
#include <iostream>
#include<algorithm>
using namespace std;
int s;
int ans;//最后的距离
int a[10000][10000];
int dp[10000][10000];
int main()
{
cin>>s;
for(int i=0;i<s;i++)
{
for(int j=0;j<=i;j++) //此处为一个下三角形 规定此时的下三角只能向下走或者沿着对角线走 这就是两个边界
{
cin>>a[i][j];
}
}
for(int i=0;i<s;i++)
{
for(int j=0;j<=i;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j]; //前者为向下走 后者为沿着对角线走 a[i][j]为这一步的大小
ans=max(ans,dp[i][j]); // dp[i][j]为比较下来最大的,是每一步与前一步的累加和
}
}
cout<<ans<<endl;
return 0;
}