序列的相关编程

1.题目:最大子序和

https://leetcode-cn.com/problems/maximum-subarray/description/

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

动态规划: 

关键:maxSum=max{ maxSum+nums[i], nums[i] };

代码实现: 

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxSum =nums[0];    //最大子序列
        int temp= nums[0];
        for(int i=1;i<nums.size();i++)
        {
            temp = max(temp+nums[i],nums[i]);       //继续连续还是从新开始    
            maxSum=max(temp,maxSum);                //记录最大值
        }
        return maxSum;
    }
};

2.题目:打家劫舍

https://leetcode-cn.com/problems/house-robber/description/

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

原理:

DP:maxSum[i] = max{ maxSum[i-2]+nums[i], maxSum[i-1] };

代码实现:

//法一
class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> maxSum;
        maxSum.resize(nums.size());
        
        //三种情况
        if(nums.empty())
            return 0;
        if(nums.size()==1)
            return nums[0];
        if(nums.size()==2)
            return max(nums[0],nums[1]);
        
        //其他情况
        maxSum[0] = nums[0];
        maxSum[1] = max(nums[0],nums[1]);

        for(int i = 2; i < nums.size(); i++)
        {
            maxSum[i] = max(maxSum[i-2]+nums[i],maxSum[i-1]);
        }
        
        return maxSum[nums.size()-1];
    }
};

//法二
class Solution {
public:
    int rob(vector<int>& nums) {
        int a = 0;
        int b = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(i&1) 
                a = max(a + nums[i], b);
            else 
                b = max(a, b + nums[i]);
        }
        return max(a, b);
    }
};

2.题目:打家劫舍 II

https://leetcode-cn.com/problems/house-robber-ii/description/

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [2,3,2]
输出: 3
解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入: [1,2,3,1]
输出: 4
解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

代码实现:

https://cloud.tencent.com/developer/article/1019109

https://cloud.tencent.com/developer/article/1019125

 

https://cloud.tencent.com/developer/article/1019346回文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: M序列是一种特殊的伪随机序列,具有良好的相关性和低自相关性。在MATLAB中,可以用编程来实现M序列。 首先,我们可以使用MATLAB内置的rand函数生成二进制伪随机序列。然后,将该序列进行移位操作,来生成不同长度的M序列。 下面是一个简单的MATLAB代码示例,演示了如何生成M序列: ```matlab % 设置M序列长度 N = 31; % 生成随机序列 random_seq = randi([0 1], 1, N); % 生成M序列 m_seq = zeros(1, N); m_seq(N) = random_seq(1); for i = 1:N-1 m_seq(i) = xor(random_seq(i), random_seq(N)); end % 打印M序列 disp(m_seq); ``` 这段代码中,首先我们设置了M序列的长度为31(可以根据需要调整)。然后,使用randi函数生成了一个长度为N的随机序列random_seq。接下来,我们使用循环遍历random_seq,通过异或运算来生成M序列m_seq。最后,我们使用disp函数打印出生成的M序列。 请注意,这只是一个简单的M序列生成器的示例代码,可能不是最优的方法。在实际应用中,还需要考虑到M序列的性能要求和算法的优化。 以上是关于M序列MATLAB编程的简要回答,希望对你有帮助! ### 回答2: M序列是一种伪随机序列,也被称为最长线性反馈移位寄存器序列。在Matlab中,我们可以使用多种方法来实现M序列编程。 一种简单的实现方法是使用移位寄存器和反馈多项式来生成M序列。首先,我们需要选择一个合适的反馈多项式。该多项式决定了数列的长度和周期等特性。然后,我们创建一个移位寄存器,其长度与反馈多项式的最高次数相同。初始化移位寄存器的状态为全零或全一,然后使用反馈多项式依次生成序列的每个元素。具体步骤如下: 1. 定义反馈多项式。例如,反馈多项式为x^10 + x^3 + 1,则可以表示为[1 0 0 0 0 0 0 0 1 0 1]。 2. 初始化移位寄存器的状态。例如,假设移位寄存器的长度为10,则初始化为全零或全一的行向量。 3. 遍历生成序列中的每个元素。根据反馈多项式和移位寄存器的当前状态计算下一个元素。具体方法是将反馈多项式的系数与移位寄存器的对应位相乘,然后将结果求和并取模2得到下一个元素。 4. 更新移位寄存器的状态。将当前生成的元素插入到移位寄存器的最高位,然后将其余位向右移动一位。 5. 重复步骤3和4,直到生成所需长度的M序列。 除了使用移位寄存器和反馈多项式的方法外,还可以使用Matlab中提供的现成函数实现M序列的生成,例如randseq函数、pnsequence函数等。这些函数具有更高的效率和更简洁的代码,适用于较复杂的M序列生成需求。 总的来说,M序列编程在Matlab中可以通过手动实现移位寄存器和反馈多项式的方式,或者利用现成的函数来实现。 ### 回答3: M序列是一种特殊的伪随机序列,可以用于通信系统中的扩频技术和数据加密等领域。在Matlab中,可以通过编程来生成M序列。 生成M序列的方法有很多种,其中一种常用的方法是使用反馈移位寄存器。首先,需要确定M序列的阶数,即序列的长度。根据生成多项式,选择适当的反馈系数。然后,初始化寄存器的初值,通常为全为1或全为0的状态。接下来,循环进行以下步骤:将寄存器内的值进行位移,并根据生成多项式进行异或运算,得到新的序列元素。将新的序列元素保存下来,作为M序列的一部分。重复该步骤,直到生成指定长度的序列。 在Matlab中,可以通过编写函数来实现M序列的生成。首先定义生成多项式和初始状态,然后使用for循环进行位移和异或运算,最后将每一次得到的序列元素保存起来。可以使用一个数组来存储生成的序列。 以下是一个简单的示例代码,用于生成M序列: ``` function m_sequence = generate_m_sequence(order, polynomial, initial_state) m_sequence = zeros(1, 2^order-1); % 初始化M序列数组 register = initial_state; % 初始化寄存器状态 for i = 1:2^order-1 m_sequence(i) = register(end); % 保存生成的序列元素 feedback = mod(sum(register(polynomial)), 2); % 计算反馈 register = circshift(register, -1); % 位移寄存器 register(1) = feedback; % 更新寄存器 end end ``` 通过调用该函数,可以得到一个长度为2^order-1的M序列。其中,order为M序列的阶数,polynomial为生成多项式,initial_state为寄存器的初始状态。 总之,通过在Matlab中编程,可以方便地生成M序列,用于扩频通信和数据加密等应用。以上是一个简单的示例代码,可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值