力扣1463 2024.5.8
原题网址:此处为链接
个人难度评价:1700
分析:
是摘樱桃的第二集,有了上一集基础想出此题很简单。
记录当前为k层,左上机器人横坐标i,右上机器人坐标j,有dp[k][i][j],对于每个状态可以由k-1的九个之前状态转移而来。
源码:
// 1463
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
class Solution {
public:
int cherryPickup(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
int a[n+1][m+1];
for (int i=1; i<=n; i++){
for (int j=1; j<=m; j++)
a[i][j] = grid[i-1][j-1];
}
int dp[n+1][n+1][m+2];
memset(dp, 0, sizeof(dp));
int ans = 0;
for (int k=1; k<=n; k++){
for (int i=1; i<=min(k, m); i++){
for (int j=m; j>=max(m-k+1, 1); j--){
dp[k][i][j] = max({dp[k][i][j], dp[k-1][i-1][j-1], dp[k-1][i-1][j], dp[k-1][i-1][j+1]});
dp[k][i][j] = max({dp[k][i][j], dp[k-1][i][j-1], dp[k-1][i][j], dp[k-1][i][j+1]});
dp[k][i][j] = max({dp[k][i][j], dp[k-1][i+1][j-1], dp[k-1][i+1][j], dp[k-1][i+1][j+1]});
dp[k][i][j] += a[k][i];
if (i != j)
dp[k][i][j] += a[k][j];
ans = max(dp[k][i][j], ans);
}
}
}
return ans;
}
};

浙公网安备 33010602011771号