最长数对链

一.题目描述

给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。

现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。

给定一个对数集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

示例 :

输入: [[1,2], [2,3], [3,4]]
输出: 2
解释: 最长的数对链是 [1,2] -> [3,4]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-pair-chain
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二.思路

跟最长上升子序列很像

这个题有两种思路:动态规划+二分查找或者排序+贪心

这里实现排序+贪心,第一个方法跟求解最长上升子序列一样,留作自己实现

class Solution:
    def findLongestChain(self, pairs: List[List[int]]) -> int:
        pairs.sort(key=lambda x:x[1])
        Result=1
        result=pairs[0]
        for i in range(1,len(pairs)):
            if pairs[i][0]>result[1]:
                result=pairs[i]
                Result+=1
        return Result

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是用C语言解决食物问题的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 1000 #define MAX_M 1000 int n, m; int a[MAX_M], b[MAX_M]; int dp[MAX_N]; int max(int x, int y) { return x > y ? x : y; } int dfs(int i) { if (dp[i] > 0) { return dp[i]; } int ans = 0; for (int j = 0; j < m; j++) { if (b[j] == i) { ans = max(ans, dfs(a[j]) + 1); } } dp[i] = ans; return dp[i]; } int main() { while (scanf("%d%d", &n, &m) == 2) { for (int i = 0; i < m; i++) { scanf("%d%d", &a[i], &b[i]); } int ans = 0; for (int i = 1; i <= n; i++) { ans = max(ans, dfs(i)); } printf("%d\n", ans); memset(dp, 0, sizeof(dp)); } return 0; } ``` 首先,我们定义了常量 `MAX_N` 和 `MAX_M` 分别表示生物数和食物数的最大值。接着,我们定义了存储输入数据的数组 `a` 和 `b`,其中 `a[i]` 和 `b[i]` 分别表示第 `i` 条食物的两端生物。 然后,我们定义了动态规划数组 `dp`,其中 `dp[i]` 表示以第 `i` 个生物为终点的最长食物长度。注意,这里我们使用了记忆化搜索的方式来实现动态规划。 接下来,我们定义了辅助函数 `max`,它用来返回两个整数中的最大值。 然后,我们定义了递归函数 `dfs`,它用来计算以第 `i` 个生物为终点的最长食物长度。具体地,对于每一个以第 `i` 个生物为终点的食物 `(i, j)`,我们递归地计算以第 `j` 个生物为终点的最长食物长度,并取其中的最大值,然后加上 `1` 得到以第 `i` 个生物为终点的最长食物长度。 最后,在主函数中,我们使用循环读入多组数据,并对于每一组数据,分别计算以每个生物为终点的最长食物长度,并取其中的最大值作为答案输出。注意,每次循环结束后要清空动态规划数组 `dp`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skj1995

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值