1.思路:
比较裸的一道dp.
2.但是我想说的是一个坑点:
把这张地图看成一个四边形,那么我们可以发现,左上点(起点),到右下点(终点),它们练成的斜线以下的那部分是到达不了的。
即在dp的过程我们应该注意对行列的限制:
内循环 行坐标i的限制:列坐标j (i<=j)
即:
for(int j=1;j<=c;j++)//列 在外循环!(至于为什么模拟一下就知道啦,肯定要将当前列的前一列
//所有可能到达的点都先经过)
for(int i=1;i<=r&&i<=j;i++){//行 (i<=j!!!,最多只能往右下走,那么所有能走的位置一定只有右上三角形)
具体细节看下方ACcode(注释嘎嘎详细,冲冲冲):
3.ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e2+10;
int n,a[N][N],dp[N][N],r,c;
void solve() {
cin>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
cin>>a[i][j];
// dp[1][1]=a[1][1];
for(int j=1;j<=c;j++)//列 在外循环!(至于为什么模拟一下就知道啦,肯定要将当前列的前一列
//所有可能到达的点都先经过)
for(int i=1;i<=r&&i<=j;i++){//行 (i<=j!!!,最多只能往右下走,那么所有能走的位置一定只有右上三角形)
//当前位置由可能到达当前三个位置中的最大值占有
dp[i][j]=max(dp[i-1][j-1],max(dp[i][j-1],dp[i+1][j-1]))+a[i][j];//转移方程
}
cout<<dp[r][c]<<"\n";
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
//cin>>t;
while(t--) {
solve();
}
return 0;
}
over~