杨辉三角形
def fun(n):
list_1=[[1]*n for i in range(n)]#相当于创建二维数组
for i in range(n):
for j in range(i+1):
if(i==j or j==0):
list_1[i][j]=1
else:
list_1[i][j]=list_1[i-1][j]+list_1[i-1][j-1]
a=max(list_1[-1])
s=0
while(a>0):
s+=1
a//=10
for i in range(n):
if(i<n-1):
print(' '*s*(n-1-i),end='')
for j in range(i+1):
print("%*d"%(s,list_1[i][j]),end=' '*s)#print("{:^}")也可用于居中但是要知道明确的位数
print('\n')
n=int(input())
fun(n)
节点选择
def dfs(node,pre):
global value,table
for i in table.get(node):
if i !=pre:
dfs(i,node)
value[node][0]+=max(value[i][0],value[i][1])
value[node][1]+=value[i][0]
def main():
global value, table
n = int(input())
value = list(map(int, input().split()))
value = list(map(lambda x:[0,x],value))
value.insert(0,0)
table = {}
for i in range(n):
table.update({i + 1: []})
for i in range(n - 1):
father, child = list(map(int, input().split()))
table.get(father).append(child)
table.get(child).append(father)
print(table)
dfs(1,0)
print(max(value[1][0],value[1][1]))
if __name__=='__main__':
main()
耐摔指数
x 星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。
塔的各层高度都是一样的。他们的第 1 层不是地面,而是相当于我们的 2 楼。
他们的地面层为 0 层。如果手机从第 7 层扔下去没摔坏,但第 8 层摔坏了,则
手机耐摔指数 = 7。
特别地,如果手机从第 1 层扔下去就坏了,则耐摔指数 = 0。
如果到了塔的最高层第 n 层扔没摔坏,则耐摔指数 = n。
为了加快测试进度,从每个型号手机中,抽样 3 部参加测试。
问题来了:如果已知了测试塔的高度 n,并且采用最佳的策略,在最坏的运气下
需要测试多少次才能确定手机的耐摔指数呢?
动态规划——耐摔指数
K好数
问题描述
如果一个自然数 N 的 K 进制表示中任意的相邻的两位都不是相邻的数字,那么
我们就说这个数是 K 好数。求 L 位 K 进制数中 K 好数的数目。例如 K = 4,L = 2
的时候,所有 K 好数为 11、13、20、22、30、31、33 共 7 个。由于这个数目很
大,请你输出它对 1000000007 取模后的值。
输入格式
输入包含两个正整数,K 和 L。
输出格式
输出一个整数,表示答案对 1000000007 取模后的值。
样例输入
4 2
样例输出
7
数据规模与约定
对于 30%的数据,KL <= 106;
对于 50%的数据,K <= 16, L <= 10;
对于 100%的数据,1 <= K,L <= 100
def add_1(num,x,y=0):
num[y]+=1
if(num[y]<x):
return num
else:
for i in range(y,len(num)):
if num[i]==x and i!=(len(num)-1):
num[i]=0
num[i+1]+=1
if(num[i+1]<x):
break
elif i==(len(num)-1):
num[i]=0
num.append(1)
break
return num
def check(num):
for i in range(len(num)):
if i==0:
if abs(num[0] - num[1]) == 1:
return [0,0]
elif i==len(num)-1:
if abs(num[i] - num[i - 1]) == 1:
return [i-1,0]
elif abs(num[i]-num[i+1])==1:
return [i,0]
return [0,1]
def main():
K,L=input().split()
K=int(K)
L=int(L)
if L==1:
print(K)
exit()
num=[ 0 for i in range(L)]
num[-1]=1
ans=0
while(len(num)==L):
index,judge=check(num)
if judge:
ans+=1
add_1(num, K)
else:
add_1(num,K,index)
print(ans)
if __name__=='__main__':
main()
Leetcode上的练习题(六道)
509.斐波那契数
1137.第 N 个泰波那契数
70.爬楼梯
746.使⽤最⼩花费爬楼梯
121.买卖股票的最佳时机
1143.最⻓公共⼦序列