走方格的方案
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
输入描述:
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
输出一行结果
示例1
输入:
2 2
输出:
6
python实现:
- 递归
- 第一步向右 的方法数 + 第一步向下的方法数
- 类似爬楼梯
def func(n, m):
if n < 0 or m < 0:
return 0 # 没法走
elif n == 0 or m == 0:
return 1
return func(n-1, m) + func(n, m-1)
def walk():
n, m = input().strip().split()
n = int(n)
m = int(m)
return func(n, m)
print(walk())
- 阶乘
import math
def walk():
row, col = map(int, input().split())
total_step = col + row
res = math.factorial(total_step) / (math.factorial(col) * math.factorial(row))
print(int(res))
walk()
- 动态规划
- 构造二维数组
- 每个点的方法数= 上面点 + 左边点 方法数之和
def walk():
n,m = map(int, input().split(' '))
dp = [[1 for i in range(n+1)] for j in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
dp[i][j] = dp[i-1][j]+dp[i][j-1]
print(dp[m][n])
walk()
合唱队
输入描述:
用例两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开
输出描述:
最少需要几位同学出列
示例1
输入:
8
186 186 150 200 160 130 197 200
输出:
4
说明:
由于不允许改变队列元素的先后顺序,所以最终剩下的队列应该为186 200 160 130或150 200 160 130
import sys
# 获取最大增长子序列
def get_max_up_sub_arr(count, arr):
up_arr = [1 for x in range(count)]
for i in range(count):
for j in range(i):
if arr[j] < arr[i]:
up_arr[i] = max(up_arr[i], up_arr[j] + 1)
return up_arr
while True:
try:
count = int(input())
arr = list(map(int, input().split(" ")))
left_up_arr = get_max_up_sub_arr(count, arr)
right_up_arr = get_max_up_sub_arr(count, arr[::-1])[::-1]
print(count - max(i + j - 1 for i, j in zip(left_up_arr, right_up_arr)))
except EOFError:
break