三角回文数&&最大和

题目

对于正整数 n, 如果存在正整数 k 使得 2n=1+2+3+⋯+k=2k(k+1)​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为6066=1+2+3+⋯+363 。

如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数。例如, 66066 是一个回文数, 8778 也是一个回文数。

如果一个整数 n 既是三角数又是回文数, 我们称它为三角回文数。例如 66066 是三角回文数。

请问, 第一个大于 20220514 的三角回文数是多少?

思路

我傻了 我以为题目是要找一个日期,不仅是三角数还是回文数。我就说怎么代码运行到最大的日期都没有满足条件的。 

代码

import os
import sys
# 请在此输入您的代码
x = 0
for i in range(10000):
  x += i  # 这样得到的数一定是个三角数
  if x>20220514 and str(x)[:] == str(x)[::-1]:
    print(x)
    break

题目

小蓝在玩一个寻宝游戏, 游戏在一条笔直的道路上进行, 道路被分成了 n 个方格, 依次编号 1 至 n, 每个方格上都有一个宝物, 宝物的分值是一个整数 (包括正数、负数和零), 当进入一个方格时即获得方格中宝物的分值。小蓝可 以获得的总分值是他从方格中获得的分值之和。

小蓝开始时站在方格 1 上并获得了方格 1 上宝物的分值, 他要经过若干步 到达方格 n。

当小蓝站在方格 p 上时, 他可以选择跳到p+1 到 p+D(n−p) 这些方格 中的一个, 其中D(1)=1,D(x)(x>1) 定义为 x 的最小质因数。

给定每个方格中宝物的分值, 请问小蓝能获得的最大总分值是多少。

思路

动态规划问题。首先先算出每个格子的D(x),从最后一个格子开始,看该格子之前的哪些格子能够跳到当前格子。选择值最大的一个进行递归。但是我代码写出来只能通过两个测试用例,呜呜 不知道为啥。

代码

import os
import sys
import math
# 请在此输入您的代码

n = int(input())
A = list(map(int, input().split()))

def get_D():
  D = []
  for i in range(n-1):
    x = n - (i+1)
    if x == 1:
      D.append(1)
    else:
      temp = []
      for j in range(2, x):
        if math.gcd(x, j) != 1:  # j为x的因数
          temp.append(j)
      temp.append(x)  # 数本身也是一个因数
      temp = list(set(temp))  # 去掉重复值
      temp.sort() # 排序后就只需要找到第一个质数就能停止
      for a in temp:
        flag = True
        for b in range(2, a):
          if math.gcd(a, b) != 1: # 该数a不是质数
            flag = False
            break
        if flag == True: # 找到第一个质数
          D.append(a) 
          break
  D.append(0) # 最后一位的D(x)为0
  return D

D = get_D()
dict_A = {}

def dfs(x):
  if x in dict_A.keys():
    return dict_A[x]
  else:
    if x == 1:
      return A[0]
    else:
      temp = []
      for i in range(x-1):
        if i+1+D[i] == x: # 能够到达当前方格的格子下标
          temp.append(i+1)
      temp.append(x-1)  # 前一个格子必能到达后一个格子
      temp = list(set(temp))  # 去掉重复值
      max_deep  = []
      for y in temp:
        max_deep.append(dfs(y))
      v = max(max_deep) + A[x-1]
      dict_A[x] = v
      return v

print(dfs(n))
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值