题目是偶尔看到的,附链接
打败万恶的ghost以后,将军准备回寝室告诉大伙儿这个消息,没想到杯具又发生了…
你知道有种鬼叫路鬼吗?让人莫名其妙的迷路,将军就被这种鬼上身了。将军本来要上楼梯的,但是因为鬼上身,他要不就上一层楼,要不就下一层楼,这个是随机的,他不能控制自己啦!
假设将军住在第M楼,因为体力原因,将军只能上或者下N次楼,刚开始将军在K楼,假设东6宿舍共有100层。现在问当体力消耗完的时候,将军刚好回到寝室那一层有多少种可能。
例如:将军住在5楼,将军的能上/下5次楼,现在在1楼,
那么将军将回不到寝室啦,为什么?我也不知道。
输入有多组测试数据,每组测试数据共一行,为M,N,K(0 < N < 21,0 < M,K < 101)的值,中间以空格分开,分别代表将军住在第几层,能移动几层和刚开始在第几层; 输出 对应每一组测试数据,输出体力消耗完时将军刚好回到寝室那一层的可能数;
样例输入
44 5 41
样例输出
5
#将军上楼梯问题
M,N,K=44,7,41
res=[[0,0] for i in range(100)]
#print(res)
res[K-1][0]=1 #定义初始状态
now=1
for i in range(N):
for j in range(100):
if j==0:
res[j][now]=res[j+1][1-now]
elif j==99:
res[j][now]=res[j-1][1-now]
else:
res[j][now]=res[j-1][1-now]+res[j+1][1-now]
now=1-now
print(res[M-1][1-now])
#输出为21
输出为 21
def callback(M,N,K,count):
#递归算法
if N==0 and K==M:
count.append(1)
#print(N)
if K==0 and N>0:
callback(M,N-1,K+1,count)
elif K==100 and N>0:
callback(M,N-1,K-1,count)
elif N>0:
callback(M,N-1,K+1,count)
callback(M,N-1,K-1,count)
def arr(M,N,K):
#数组记录
res=[[]for i in range(N)]
for i in range(N):
if i==0:
res[i]=[K-1,K+1]
else:
#print("this is",res) #输出最新的res
for j in range(len(res[i-1])):
if res[i-1][j]-1>0:
res[i].append(res[i-1][j]-1)
if res[i-1][j]+1<100:
res[i].append(res[i-1][j]+1)
print(res[-1])
a=0
for i in range(len(res[-1])):
if res[-1][i]==M:
a+=1
return a
if __name__ == "__main__":
M,N,K= 44,5,41
count=[]
callback(M,N,K,count) #使用递归解法
print('递归解法输出:',len(count))
b=arr(M,N,K)
print("数组解法输出:",b)
题目:一个人每次只能走一层楼梯或者两层楼梯,从一层开始问走到第N层楼梯一共有多少种方法。
#动态规划解法 此处设N为100
def dp(number):
if number==1:#边界条件
return 1
if number==2:#边界条件
return 2
result=[1,2]#只存储前2次结果
count=2
while count<number:
next_step=sum(result)
result=[result[1],next_step]#等同于状态转移方程
count+=1
return result[-1]
print(dp(100))