题目链接
题目大意:就是猴子可以跳到自己当前树的向下的高度,也可以跳到向下的高度,跳到每一个高度可以得到相应的香蕉,问可以得到的最大的香蕉。
题解:简单的dp,但是要注意几个问题。
下面是AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define int long long
vector<vector<int> > dp;//这是二维动态数组
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);//一要加入这几个函数,否则,会超时
int n,m;
cin>>n>>m;
dp.resize(n+2);
dp[0].resize(m+2);
dp[n+1].resize(m+2);//二维数组的用法,这样用可以减少内存的使用。
for(int i=1;i<=n;i++)
{
dp[i].resize(m+2);
for(int j=1;j<=m;j++)
{
int x;
cin>>x;
dp[i][j]=x;
}
}
for(int j=1;j<=m;j++)
{
for(int i=1;i<=n;i++)
{
dp[i][j]+=max(dp[i][j-1],max(dp[i+1][j-1],dp[i-1][j-1]));
}
}//这里是状态转移方程
int maxans=0;
for(int i=1;i<=n;i++)
{
maxans=max(maxans,dp[i][m]);//找到答案。
}
printf("%lld\n",maxans);
return 0;
}
注:这里还要注意的一个问题是一定要先更新列,再更新行,所以for循环内n在第二行。(因为我们已知第一列和最后一行的数)
因为我们已知的是第一列和最后一行的数,所以还要从下往上更新。