算法作业二

本文介绍了四个算法问题的解决方案,包括基址选址问题(使用贪心算法)、最长递增子序列问题(动态规划,时间复杂度O(n^2))、最长回文子序列问题(动态规划,时间复杂度O(n^2))和餐厅选址问题(动态规划类似背包问题)。每个问题都包含了题意解析、思路概述和伪代码。
摘要由CSDN通过智能技术生成

1、基址选址问题

题意:

假定有一条很长的直线形河流,在河岸上有 n 个房子。可以将该河流看作一条坐标轴,房 子的位置以一维坐标的形式按严格递增的顺序给出 (单位为公里)。某通信公司希望在河岸的某 些位置搭建手机基站,使得对任意一间房子都存在一个基站到它的距离小于等于 c 公里,c 为给 定的一个常数。请给出一个有效的算法来最小化需要搭建的基站的数量,并证明算法的正确性。 (注:时间复杂度为 O(n) )

思路:

在这里插入图片描述
首先确定第一个基站的位置,我们不妨假设c = 6,根据贪心算法,应将基站1建立在(5+6)米处,这样正好能覆盖到第1个房子。再看第2个房子,该房子在15米处,由于基站1建立在11米处,能覆盖5~17米范围,所以能被基站1覆盖,无须新建基站。接下来看第3个房子,该房子在25米处,超出了基站1的覆盖范围,所以需要新建基站,该基站的建设位置应是(25+6)米处,以此类推。

伪代码:

'''
N:表示房子数
k:表示基站的个数
d[i]:表示房子i距离起点的距离
s[k]:表示基站k距离起点的距离
'''
i = 1
k = 0
while(i <= N):
    j = i + 1
    while(j <= N and d[j] - d[i] <= 2c):
        j += 1
    k += 1
    s[k] = d[i] + c
    i = j

2、最长递增子序列问题

题意:

请设计一个 O ( n 2 ) O(n^2) O(n2)的动态规划算法来求出一个包含 n 个元素的序列中的最长递增子序列。 所谓递增子序列是指,从原序列中按顺序挑选出某些元素组成一个新序列,并且该新序列中的任 意一个元素均大于该元素之前的所有元素。例如,输入的序列为 < 5, 24, 8, 17, 12, 45 >,那么该 序列的最长递增子序列为 < 5, 8, 12, 45 > 或 < 5, 8, 17, 45 >。请分析你的算法的正确性并验证其 时间复杂度。

思路:

设长度为n的数组为[a0, a1, …, an-1],假定以aj结尾的数组序列的最长递增子序列长度为L[j],则可以得出公式L[j]=1+{max(L[i]), i < j且a[i] < a[j]}.
也就是说,我们需要遍历在j之前的所有位置i(从0到j-1),找到满足条件a[i] < a[j]的L[i],求出max(L[i])+1即为L[j]的值。
最后,我们遍历数组L[j] (j从0到n-1),找出其最大值即为最大递增子序列的长度。
由此可见,需要两层循环,时间复杂度为O(n^2)

伪代码:

int lis()
{
   
    #初始化
    int dp[n];
    for(i = 0;i < n;i++)
        dp[i] =  1;
    for(j = 0; j < n; j++)
    {
   
        for(i = 0; i < j; i++)
        {
   
            if(a[i] < a[j] && dp[j] < dp[i] + 1)
                dp[j] = dp[i] + 1;
        }
    }
    int maxx = 0;
    for(j = 0;j < n;j++
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值