首页 > 其他分享 >力扣741 2024.5.6

力扣741 2024.5.6

时间:2024-05-07 15:02:41浏览次数:24  
标签:741 2024.5 int 力扣 右来 第二次 now dp

原题网址:https://leetcode.cn/problems/cherry-pickup/description/?envType=daily-question&envId=2024-05-06

个人难度评价:1800

分析:
自然的想到分两次dp,第一次dp后修改格点值,然后进行第二次dp。这种做法是错误的:第一次dp的过程中,每次选择都对第二次dp产生后效性。
明显从左上到右下和从右下到左下是等效的,那么能否一次dp中就完成两次?
有dp[i][j][x][y],i j为第一次的横纵坐标,x y为第二次的横纵坐标,保证两次的步数相同(记为k步),有i+j=x+y=k+2。那么我们就可以得知当前状态下两次是否到达同一格,可以及时制止第二次的转移。
此时实际已经可以通过,但显然有一个可以使代码更简单的优化:既然i+j=x+y=k+2恒成立,那么j与y显然可以省略,只需要k i x三维即可。
那么最终做法显然dp[k][i][x],枚举k与每个合法i x,转移显然四种:
从右右来, 从右下来, 从下右来, 从下右来。
注意处理荆棘导致的不可达

源码:

// 741
#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 dp[2*n-1][n+1][n+1];
        memset(dp, 0xf0, sizeof(dp));
        int a[n+1][n+1];
        for (int i=1; i<=n; i++)
            for (int j=1; j<=n; j++)
                a[i][j] = grid[i-1][j-1];
        int j, y;
        int now;
        dp[0][1][1] = a[1][1];
        for (int k=1; k<n*2-1; k++){
            for (int i=1; i<=min(k+1, n); i++){
                for (int x=1; x<=i; x++){
                    if (k-i+2 > n || k-x+2 > n){
                        continue;
                    }
                    j = k + 1 - i + 1;
                    y = k + 1 - x + 1;
                    if (a[i][j] == -1 || a[x][y] == -1){
                        continue;
                    }
                    now = max({dp[k-1][i][x], dp[k-1][i-1][x], dp[k-1][i][x-1], dp[k-1][i-1][x-1]});
                    now += a[i][j];
                    if (i != x)
                        now += a[x][y];
                    dp[k][i][x] = now;
                }
            }
        }
        int ans = max(dp[2*n-2][n][n], 0);
        return ans;
    }
};

标签:741,2024.5,int,力扣,右来,第二次,now,dp
From: https://www.cnblogs.com/TrainerMarvin/p/18177329

相关文章

  • 2024.5.6 近期练习
    P3354[IOI2005]Riv河流如果我们设\(f_{u,j}\)表示子树\(u\)内放了\(j\)个伐木场的答案,发现很难转移。我们多加状态,设\(f_{u,i,j}\)表示子树\(u\)放了\(j\)个伐木场,木材全部运到\(i\)去最小代价。\(i\)是\(j\)祖先。继续设\(g_{u,i,j}\)表示\(u\)建了伐......
  • 云原生周刊:Terraform 1.8 发布 | 2024.5.6
    开源项目推荐xlskubectl用于控制Kubernetes集群的电子表格。xlskubectl将GoogleSpreadsheet与Kubernetes集成。你可以通过用于跟踪费用的同一电子表格来管理集群。git-syncgit-sync是一个简单的命令,它将git存储库拉入本地目录,等待一段时间,然后重复。当远程存储库......
  • 力扣1218.最长定差子序列
    题目给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于difference。​ 子序列是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从arr派生出来的序列。解题思路​ 动态规划1.常......
  • 力扣309.买卖股票的最佳时机含冷冻期
    题目给定一个整数数组prices,其中第prices[i]表示第*i*天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为1天)。注意:你不能同时参与多笔交易(你必须在再次......
  • 腾讯公益赛个人冲刺博客10(2024.5.6)
    今天测试多人联机整体效果    ......
  • 腾讯公益赛个人冲刺博客7(2024.5.1)
    今天处理sos的定位功能,但自动定位功能不稳定,需要手动定位importandroid.Manifest;importandroid.content.pm.PackageManager;importandroid.os.Bundle;importandroid.widget.Toast;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivit......
  • 腾讯公益赛团队冲刺博客8(2024.5.2)
    未完成sos弹窗功能,在线医生、聊天室进行中sos弹窗功能已完成sos查看地图功能与弹窗功能、帮扶、登录注册、主页  ......
  • 腾讯公益赛团队冲刺博客7(2024.5.1)
    未完成sos地图定位功能和弹窗功能,在线医生、聊天室进行中sos的定位功能已完成sos的查看地图功能、帮扶、登录注册、主页  ......
  • 腾讯公益赛团队博客10(2024.5.6)
    未完成在线医生、聊天室功能进行中在多人手机端测试程序的可行性已完成sos、帮扶基本功能、登录注册、主页  ......
  • 腾讯公益赛团队冲刺博客9(2024.5.3)
    未完成在线医生、聊天室、多人弹窗进行中在线数据库的连接,保证不同的网络都可以连接到一个数据库已完成sos、帮扶的基本功能,登录注册和主页  ......