1、基因相似问题
基因由 A B C D E 组成,若男女两个人的基因序列的相似度大于50%,则不能结婚,相似度=两个子序列的最大公共长度(不考虑顺序)。
该题本质是最长公共子序列问题(LCS),详情参考:动态规划2.6)
def lengthOfLongestCommonSubsequence(arrA, arrB,M):
if arrA == [] or arrA == []:
return 0
#创建2维矩阵存储公共序列长度
dp = [[0]*(M + 1) for row in range(M + 1)]
for i in range(1, M + 1):
for j in range(1, M + 1):
if arrA[i - 1] == arrB[j - 1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
res=round(dp[M][M]/M,2)
if res<0.5:
return (res,'Yes' '')
else:
return (res,'No' '')
if __name__ == '__main__':
M=int(input('序列长度:'))
arrA = [i for i in input().split()]
arrB = [i for i in input().split()]
result=lengthOfLongestCommonSubsequence(arrA, arrB,M)
print(result)
2、回位数问题
给定两个数,求这两个数之间有多少回位数?
回位数:一个数字去掉一位后,是素数
题意可能记错了,整理了下面的扩展题目
a,b=input().strip().split()
a=int(a)
b=int(b)
def sushu(x):
sum1=0
for i in range(2,int(x/2)+1):
d=x/i
if d != int(d):
sum1=sum1+1
if sum1==(int(x/2)-1):
return 1
else:
return 0
count=0
for i in range(a,b):
v=str(i)
ll=len(v)
vv=[]
for j in range(ll):
if j==(ll-1):
vv.append(int((v[0]+v[j])))
else:
vv.append(int(v[j:j+ll-1]))
vv=set(vv)
for j in vv:
count=count+sushu(j)
print(count)
3.拓展题目
参考链接:拓展题目详情
3.1素数
求n以内的素数,注意:1不是素数。
思想:对2-n-1区间进行合理优化,假设x*y=n(x<=y),那么当x和y相等时,x有最大值。即x=y=sqrt(n),所以x的区间就可以限制为2~sqrt(n)+1。
break语句用于停止整个循环,continue语句用于停止当次循环转而进入下一次循环。
# 求解10以内的所有素数,正确版本
import math
num = 2
count = 0
list_s = []
max_d = 10
while num < max_d:
length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化
"""原来for也可以接else!!!!!!!!!!!!!!!!!!!!!!!!!
break跳出循环,执行while下一个num
"""
for i in range(2,length): # 注意从2开始
if num % i == 0:
break
# 这里的else跟for对齐,而不是跟if,表示只有for顺利执行时,else才执行,表示找不到因子后才认定是素数
else:
count += 1
list_s.append(num) # 存入列表
num += 1
if count == 0:
print(max_d,'以内没有素数')
else:
print(max_d,'以内的素数有',count,'个,分别是:',list_s)
3.2 判断回文数
回文数即从左到右和从右到左一样,如:12321。
n,m=list(map(int,input().split()))
[x for x in range(n,m) if x == int(str(x)[::-1])]