首页 > 其他分享 >LeetCode132双周赛T3,搜索和DP

LeetCode132双周赛T3,搜索和DP

时间:2024-06-13 10:32:54浏览次数:20  
标签:dfs nums int max dp len LeetCode132 双周 DP

求出最长好子序列 I

dfs(i,j)表示
nums[i]结尾的,至多有j对相邻元素不同的最长序列的长度
转移:枚举 p<i,
如果 nums[p]!= nums[i],就从 dfs(p,j-1)+ 1 转移过来
如果 nums[p]== nums[i],就从 dfs(p;j)+1 转移过来

class Solution {
public:
    int maximumLength(vector<int>& nums, int k) {
        int n = nums.size();
        vector<vector<int>> f(n + 1, vector<int>(n + 1, 0));
        int res = 0;
        function<int(int, int)>  dfs = [&](int u, int j){
            if(f[u][j])return f[u][j];
            int len = 0;
            for(int i = u - 1; i >= 0; i --)
            {
                if(nums[i] == nums[u]) len = max(len, dfs(i, j) + 1);
                else if(j > 0)len = max(len,dfs(i, j - 1) + 1 );
            }
            f[u][j] = len;
            return len;
        };
        for(int i = 0; i < nums.size(); i ++)
        {
            res = max(res,dfs(i,k) + 1);
        }
        return res;
    }
};

lambda 说明,[&]表示如果用到外面的变量,传递引用
[]啥也不加,表示如果用到外面变量,复制一个进来
如果写的是递归函数,则需要说明返回值是什么,写的不是递归,可以用auto自动推断

DP的写法

class Solution:
    def maximumLength(self, nums: List[int], k: int) -> int:
        n = len(nums)
        if n == 0:
            return 0
        
        # dp[i][j] 表示以 nums[i] 结尾,前面有 j 个不同的最长子序列长度
        dp = [[0] * (k + 1) for _ in range(n)]
        
        # 初始化
        for i in range(n):
            dp[i][0] = 1
        
        max_len = 1
        
        for i in range(1, n):
            for j in range(k + 1):
                for m in range(i):
                    if nums[i] == nums[m]:
                        dp[i][j] = max(dp[i][j], dp[m][j] + 1)
                    elif j > 0:
                        dp[i][j] = max(dp[i][j], dp[m][j - 1] + 1)
                max_len = max(max_len, dp[i][j])
        
        return max_len

标签:dfs,nums,int,max,dp,len,LeetCode132,双周,DP
From: https://blog.csdn.net/m0_58809631/article/details/139565337

相关文章

  • NLP实战入门——文本分类任务(TextRNN,TextCNN,TextRNN_Att,TextRCNN,FastText,DPCNN,BERT,ERN
    本文参考自https://github.com/649453932/Chinese-Text-Classification-Pytorch?tab=readme-ov-file,https://github.com/leerumor/nlp_tutorial?tab=readme-ov-file,https://zhuanlan.zhihu.com/p/73176084,是为了进行NLP的一些典型模型的总结和尝试。中文数据集从THUCNews......
  • 13. UDP协议与RTP协议
    UDP协议UDP协议比较简单:UDP的长度是固定的,用总长度-UDP长度就是数据长度。UDP是不保证他的有序性和可靠性的。对于音频和视频是这样是比较好的,因为这段丢了,我们可以从下一段在开始解码。RTPRTP协议概述RTP(Real-timeTransportProtocol)是用于Internet上针对多媒体......
  • DP经典问题----背包问题的代码实现(入门级)(C++/PYTHON)
    背包的状态转换方程i:表示物品序号j:表示背包大小W[i]:表示第i件物品的重量f[i,j]:表示在前i件物品中选择若干件放在承重为j的背包中,可以取得的最大价值f[i-1,j-Wi]:表示在前i-1件物品中选择若干件放在承重为j-Wi的背包中,可以取得的最大价值Pi(j>=Wi):表示第i件物品的价值,要......
  • [DP] DP优化总结
    写在前面$DP$,是每个信息学竞赛选手所必会的算法,而$DP$中状态的转移又显得尤为关键。本文主要从状态的设计和转移入手,利用各种方法对朴素$DP$的时间复杂度和空间复杂度进行优化与处理,以达到满足题目要求的目的;参考文献:动态规划算法的优化技巧毛子青c++DP总结《算......
  • 状压dp
    状压dp1.状态压缩状态压缩就是使用某种方法,以最小的代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要使用状态压缩的对象的点的状态只有两种:0和1。2.使用条件1.解法需要保存一定的状态数据(表示一种状态的一个数据值),每个状态通常情况下是可以用二进制......
  • [DP] DP优化总结
    写在前面$DP$,是每个信息学竞赛选手所必会的算法,而$DP$中状态的转移又显得尤为关键。本文主要从状态的设计和转移入手,利用各种方法对朴素$DP$的时间复杂度和空间复杂度进行优化与处理,以达到满足题目要求的目的;参考文献:动态规划算法的优化技巧毛子青c++DP总结《算......
  • [DP] [倍增优化] Luogu P1081 [NOIP2012 提高组] 开车旅行
    [NOIP2012提高组]开车旅行题目描述小\(\text{A}\)和小\(\text{B}\)决定利用假期外出旅行,他们将想去的城市从$1$到\(n\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为\(h_i\),城市\(i\)和城市\(j\)之间的距......
  • DP(优化)
    史不分好坏。是史就应该冲进......
  • atcoder 官方dp题单题解(持续更新)
    题单链接:https://atcoder.jp/contests/dp/tasks洛谷搜索:https://www.luogu.com.cn/problem/list?keyword=at_dp&type=AT|B|CF|P|SP|UVA&page=1A题目链接:https://atcoder.jp/contests/dp/tasks/dp_a简单线性dp.dp[i]表示在i这个位置的最小代价,转移的时候把两种选择都考虑......
  • 用于每个平台的最佳WordPress LMS主题
    你已选择在WordPress上构建学习管理系统(LMS)了。恭喜!你甚至可能已经选择了要使用的LMS插件,这已经是成功的一半了。现在是时候弄清楚哪个WordPressLMS主题要与你的插件配对。我将解释LMS主题和插件之间的区别,以便你了解要寻找什么。然后,我将提供市场上每个最流行......