题解:
dp[i][j]表示到达(i,j)这个点获得的最大值dp[i][j]表示到达(i,j)这个点获得的最大值dp[i][j]表示到达(i,j)这个点获得的最大值
dp[i][j]=max(dp[i][j−1]+val(i,j)),dp[i][j]=max(dp[i−1][j−1]+val(i,j)),dp[i][j]=max(dp[i+1][j−1]+val(i,j)),dp[i][j] = max(dp[i][j-1]+val(i,j)),dp[i][j] = max(dp[i-1][j-1]+val(i,j)),dp[i][j] = max(dp[i+1][j-1]+val(i,j)),dp[i][j]=max(dp[i][j−1]+val(i,j)),dp[i][j]=max(dp[i−1][j−1]+val(i,j)),dp[i][j]=max(dp[i+1][j−1]+val(i,j)),
注意细节:前一个点要取了,才能转移到后面一个点,就比如起点必须取,所以一开始必须从起点开始转移注意细节:前一个点要取了,才能转移到后面一个点,就比如起点必须取,所以一开始必须从起点开始转移注意细节:前一个点要取了,才能转移到后面一个点,就比如起点必须取,所以一开始必须从起点开始转移
#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
int mp[105][105];
int r,c;
int main(){
cin>>r>>c;
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
cin>>mp[i][j];
dp[1][1] = mp[1][1];
for(int j = 1; j <= c; j++){
for(int i = 1; i <= r; i++){
if(dp[i][j-1]){
dp[i][j] = max(dp[i][j],dp[i][j-1]+mp[i][j]);
}
if(dp[i-1][j-1]){
dp[i][j] = max(dp[i][j],dp[i-1][j-1]+mp[i][j]);
}
if(dp[i][j-1]){
dp[i][j] = max(dp[i][j],dp[i+1][j-1]+mp[i][j]);
}
}
}
/*for(int j = 1; j <= r; j++){
for(int i = 1; i <= c; i++){
cout<<dp[j][i]<<" ";
}
puts("");
}*/
printf("%d\n",dp[r][c]);
}
本文详细解析了一个使用动态规划算法求解二维网格中从起点到终点的最大值路径问题。通过递推公式dp[i][j]=max(dp[i][j−1]+val(i,j)),dp[i−1][j−1]+val(i,j)),dp[i+1][j−1]+val(i,j)),阐述了如何从前一个点获取最大值并转移到下一个点的过程。特别强调了前一个点必须被取走才能进行转移的重要性。
732

被折叠的 条评论
为什么被折叠?



