LeeCode 5478 DP

159 篇文章 1 订阅
题意

传送门 LeeCode 5478. 最大得分

题解

d p [ i ] [ j ] dp[i][j] dp[i][j] 代表终点为第 i i i 个数组的 j j j 个位置可获得的最大分数,设相同数字在另一个数组对应的索引为 i d x idx idx

d p [ i ] [ j ] = { d p [ i ] [ j − 1 ] + n u m s [ i ] [ j ] d p [ i ⊕ 1 ] [ i d x − 1 ] + n u m s [ i ] [ j ] dp[i][j]=\begin{cases} dp[i][j-1]+nums[i][j] \\ dp[i\oplus1][idx-1]+nums[i][j]\\ \end{cases} dp[i][j]={dp[i][j1]+nums[i][j]dp[i1][idx1]+nums[i][j]

m a p map map 记录元素的索引值,记忆化搜索求解即可。

class Solution
{
#define mod 1000000007
#define maxn 100005
typedef long long ll;
public:
    ll dp[2][maxn];
    unordered_map<int, vector<int>> mp;
    ll rec(int i, int j, vector<int> &nums1, vector<int> &nums2)
    {
        if (j < 0)
            return 0;
        if (dp[i][j] != -1)
            return dp[i][j];
        vector<int> &x = (i ? nums2 : nums1);
        ll res = rec(i, j - 1, nums1, nums2) + x[j];
        if (mp[x[j]].size() == 2)
        {
            int pre = (i ^ 1) & 1;
            res = max(res, rec(pre, mp[x[j]][pre] - 1, nums1, nums2) + x[j]);
        }
        return dp[i][j] = res;
    }
    int maxSum(vector<int> &nums1, vector<int> &nums2)
    {
        int n1 = nums1.size(), n2 = nums2.size();
        for (int i = 0; i < n1; i++)
        {
            mp[nums1[i]].push_back(i);
        }
        for (int i = 0; i < n2; i++)
        {
            mp[nums2[i]].push_back(i);
        }
        memset(dp, -1, sizeof(dp));
        return max(rec(0, n1 - 1, nums1, nums2), rec(1, n2 - 1, nums1, nums2)) % mod;
    }
};
基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值