2024-2025-2学期(2025年春季学期)AI2615算法设计与分析期末真题,题目经过翻译,来自于我的一位好友。
原文链接
T1(本题满分25分)
设序列A:(a1,a2,…,an),序列B:(b1,b2,…,bm),其中m<n。
我们定义序列B是序列A的子序列,当且仅当序列B中的元素按照顺序在序列A中出现。比如说,设A=(1,2,3,4,5,6,7),B1=(1,3,5),B2=(3,1,5),那么B1是A的子序列,而B2不是。
请你设计一个O(n)的算法,判断读入的序列B是否是读入序列A的子序列。证明你的算法的正确性并且分析其时间复杂度。
T2(本题满分25分)
已知工厂里仅有一台机器,接下来n天的最大生产计划x1,x2,⋯,xn,与机器的最大生产量s1,s2,⋯,sn。
对于每一天,你有两种选择:
- 对机器进行检修,那么当天的生产量为0;
- 让机器继续生产,那么假设上一次检修时间是第j天,今天是第i天,那么机器的生产量是min{si−j,xi}。
请你设计算法,通过合理规划机器的检修和生产,最大化机器在n天中的总产量,分析其时间复杂度并证明其正确性。
T3(本题满分25分)
设U={1,2,3,⋯,n},S={A1,A2,⋯,Am},且S中的每个元素都是U的子集。k是一个给定的小于等于n的整数。
已知:S可以被划分为两个集合(即S中的每个元素都出现在一个集合中),其中每个集合中的元素两两不交。例如,S={{1,2,3},{4,5,6},{1,2},{3,4},{5,6}}就是一个符合上述条件的集合。
证明:存在大小为k的集合T,满足∀Ai∈S,均有:
∣Ai∩T∣≤⌈nk⋅∣Ai∣⌉
T4(本题满分25分)
我们可以按照如下的方式定义停机问题:读入一个字符串,将其看成在 C++ 下的代码,判断如果执行这份代码,程序是否会终止。无论是编译不通过,程序运行异常导致的终止,还是正常终止,都被视为程序终止。
(1)证明:停机问题是NP−hard的
(2)停机问题是NP−complete吗?证明你的断言。