算法练习--动态规划 相关

走方格的方案

请计算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

猜你喜欢

转载自blog.csdn.net/weixin_45228198/article/details/132222358
今日推荐