既约分数&&t跳跃

文章讲述了如何通过判断分子和分母的最大公约数为1来确定既约分数,并给出了一段Python代码实现。接着,文章转向了一个动态规划问题,描述了小蓝在方格图中寻找最大权值路径的游戏,提出了动态规划的解题思路和代码实现。
摘要由CSDN通过智能技术生成

 题目

 如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。

例如 3/4,1/8,71/43​,8/1​,1/7​, 都是既约分数。

请问,有多少个既约分数,分子和分母都是 1到 2020之间的整数(包括 1和 2020)?

思路

  直接对分子分母的公约数进行判断,如其最大公约数为1,则为既约分数。

代码

import os
import sys
import math
# 请在此输入您的代码
count = 0
for i in range(1, 2021):
  for j in range(1, 2021):
    if math.gcd(i, j) == 1 :  # math.gcd() 方法返回给定的整数参数的最大公约数。
      count += 1
print(count)

题目

题目描述

小蓝在一个 n 行 m 列的方格图中玩一个游戏。

开始时,小蓝站在方格图的左上角,即第 1行第 1列。

小蓝可以在方格图上走动,走动时,如果当前在第 r 行第 c 列,他不能走到行号比 r 小的行,也不能走到列号比 c 小的列。同时,他一步走的直线距离不超过 3。

例如,如果当前小蓝在第 3 行第 5 列,他下一步可以走到第 3 行第 6 列、第 3 行第 7 列、第 3 行第 8 列、第 4 行第 5 列、第 4 行第 6 列、第 4 行第 7 列、第 5 行第 5 列、第 5 行第 6 列、第 6行第 5 列之一。

小蓝最终要走到第 n 行第 m 列。

在图中,有的位置有奖励,走上去即可获得,有的位置有惩罚,走上去就要接受惩罚。奖励和惩罚最终抽象成一个权值,奖励为正,惩罚为负。

小蓝希望,从第 1 行第 1 列走到第 n 行第 m 列后,总的权值和最大。请问最大是多少?

输入描述

输入的第一行包含两个整数 n,m,表示图的大小。

接下来 n 行,每行 m 个整数,表示方格图中每个点的权值。

其中,1≤n≤100,−10^4≤权值≤10^4。

输出描述

输出一个整数,表示最大权值和。

思路

这个题目跟之前的杨辉三角很相似,也是从某个点出发,到另一个点的最大值。都属于动态规划这一类的问题。发现自己遇见这样的题目,都不会写!呜呜 我只会去找当前可达的局部最大(我是废物)。然后就去学了一下动态规划,学会递归思想。然后就试着写了一下,发现好像是正确的耶!我是能干的小火车!

B站视频

代码

import os
import sys

# 请在此输入您的代码
n, m = input().split()
data = []
n = int(n)
m = int(m)
# 这里不需要这样转化 使用map函数 n, m = list(map(int, input().split()))
for i in range(n):
  data.append(input().split())
offset = [[0, -1], [0, -2], [0, -3], [-1, 0], [-1, -1], [-1, -2], [-2, 0], [-2, -1], [-3, 0]]
mem = {}  # 用来记录已经找到的到某点的最大值 字典的key是二维数组投影到list的顺序

def max_data(x, y):
  if x*m + y + 1 in mem:  # 要是到该点的最大值已经被计算过了 则直接查找 减少计算次数
    return mem[x*m + y + 1]

  if x == 0 and y == 0:  # 递归到起点就不继续往下进行递归了 返回原点的值
    return int(data[0][0])

  a = []
  for i in offset:
    if x + i[0] >=0 and y + i[1] >= 0:  # 排除掉不合法的邻居 也就是到达矩阵的边界部分
      a.append(max_data(x + i[0], y + i[1]))
  num = max(a) + int(data[x][y])
  
  mem[x*m + y + 1] = num  # 记录到达当前点的最大值
  return num
  
print(max_data(n-1, m-1) )

tips:

使用map函数:

map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

data.append(list(map(int, input().split())))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值