小猪过河(最长上升子序列)

本文解析了一个关于小猪过河的实际问题,转化为寻找经过n个入口后河对岸小猪保持原队列倒序的最长过河序列。通过贪心和二分搜索策略解决,探讨了如何利用最长上升子序列算法求解最大过河小猪数。

小猪过河(通信网理论基础)

只小猪排成一个队列在沿河的公路上飞驰。现有n个入口,第i个入口唯一对应河对岸的第j个出口。小猪队列在经过第i个入口时可以选择过河与否,若选择过河,则队首的一只小猪去到对岸第j个出口。要求经过了n个入口后,河对岸小猪的相对顺序与原队列相同(倒序)。求最大过河小猪数。
如图:输入为(4,2,6,1,3,5)表示第一个入口对应第4个出口,第二个入口对应第二个入口,等等。
在这里插入图片描述
情况1表示,选择了所有入口进入,导致河对岸的小猪相对顺序与原队列不同。
情况2表示,只选择了2,5,6号入口进入,河对岸小猪的相对顺序与原队列相同,同时河对岸小猪数量最大。(在4,5,6号入口进入也是3)

输入:第一行为正整数t,表示t个测试用例。之后t行,每行m<20000个正整数,其中第i个正整数j表示第i个入口对应第j个出口。
输出:每个用例输出一行,该行有一个正整数,表示最大河对岸小猪数。

样例:
输入:
3
4 2 6 1 3 5
1 2 3 4 5 6 7
8 7 6 5 4 3 2 1
2 8 1 5 6 4 3 8 9
输出:
3
7
1
5

题目分析:
该问题为最长上升子序列问题。
贪心+二分的算法。

def FindLIS(k):
    l=list()
    l.append(eval(k[0]))
    for i in k:
        flag= 0
        for j in range(len(l)):
            if eval(i)<= l[j]:
                l[j]=eval(i)
                flag=1
                break
        if flag==0:
            l.append(eval(i))
    print(len(l))


if __name__ == '__main__':
    fo= open('D:/小猪过河/测试数据1.txt', 'r')
    count= fo.readline()
    print("测试用例数量为:{}".format(count))
    for i in range(eval(count)):
        k= fo.readline().split()
        FindLIS(k)

### 小猪过河算法问题编程实现 小猪过河问题可以通过动态规划(Dynamic Programming, DP)来解决。问题的核心在于,需要在保证河对岸的小猪相对顺序与原队列相同或倒序的前提下,求出最大过河小猪数。以下是基于动态规划的 Python 实现。 #### 动态规划思路 1. 定义状态 `dp[i][j]` 表示前 `i` 只小猪中选择 `j` 只过河的最大可能性。 2. 转移方程为: - 如果第 `i` 只小猪过河,则 `dp[i][j] = dp[i-1][j]`。 - 如果第 `i` 只小猪过河,则需要确保之前过河小猪满足相对顺序要求,即 `dp[i][j] = max(dp[i][j], dp[k][j-1])`,其中 `k` 是满足顺序约束的索引。 3. 最终答案为 `max(dp[n][j])`,其中 `j` 为可能的最大过河小猪数。 以下是 Python 实现代码: ```python def max_pigs_cross_river(pigs): n = len(pigs) # 初始化 dp 数组 dp = [[0] * (n + 1) for _ in range(n + 1)] # 动态规划转移 for i in range(1, n + 1): for j in range(1, i + 1): # 不选择当前小猪过河 dp[i][j] = dp[i-1][j] # 选择当前小猪过河 if j > 0: dp[i][j] = max(dp[i][j], dp[i-1][j-1] + 1) # 检查相对顺序是否满足条件 if j > 1 and pigs[i-1] < pigs[dp[i-1][j-1]-1]: dp[i][j] = max(dp[i][j], dp[i-1][j-1]) # 寻找最大过河小猪数 result = 0 for j in range(1, n + 1): result = max(result, dp[n][j]) return result # 示例输入 pigs = [1, 2, 3, 4, 5] print(max_pigs_cross_river(pigs)) # 输出最大过河小猪数 ``` 上述代码实现了动态规划求解小猪过河问题,并通过检查相对顺序约束来确保河对岸的小猪队列满足题目要求[^1]。 #### 相关数学计算验证 对于给定的队列 `[1, 2, 3, 4, 5]`,假设所有小猪都可以过河,则最终的相对顺序应为倒序 `[5, 4, 3, 2, 1]`。通过动态规划计算可以验证这一结果[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值