力扣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;
    }
};
posted @ 2024-05-08 16:23  训练师马文  阅读(12)  评论(0)    收藏  举报