首页 > 试题广场 >

Redraiment的走法

[编程题]Redraiment的走法
  • 热度指数:193249 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
Redraiment是走梅花桩的高手。Redraiment可以选择任意一个起点,从前到后,但只能从低处往高处的桩子走。他希望走的步数最多,你能替Redraiment研究他最多走的步数吗?

数据范围:每组数据长度满足 , 数据大小满足




输入描述:

数据共2行,第1行先输入数组的个数,第2行再输入梅花桩的高度



输出描述:

输出一个结果

示例1

输入

6
2 5 1 5 4 5 

输出

3

说明

6个点的高度各为 2 5 1 5 4 5
如从第1格开始走,最多为3步, 2 4 5 ,下标分别是 1 5 6
从第2格开始走,最多只有1步,5
而从第3格开始走最多有3步,1 4 5, 下标分别是 3 5 6
从第5格开始走最多有2步,4 5, 下标分别是 5 6
所以这个结果是3。     
def count(n,nums,res):
    for i in range(2,n+1):
        for j in range(1,i):
            if nums[-i]<nums[-j] and res[-i]<res[-j]+1:
                res[-i]=res[-j]+1
    return max(res)
while True:
    try:
        n=int(input())
        nums = [int(x) for x in input().split()]
    except:
        break
    res=[1]*n
    print(count(n,nums,res))
没引入库,用动态规划解决了
发表于 2021-06-25 10:32:06 回复(0)
请问大家,自测输入结果是对的,但是提交显示0/10 通过,请问,这代码有什么问题吗,先谢谢了
while True:
    try:
        n=int(input())
        input_list=input().strip().split()
        steps=[1 for i in range(n)]
        for i in range(n-2,-1,-1):
            for j in range(i+1, n):
                if input_list[j]>input_list[i] and steps[j]+1>steps[i]:
                    steps[i]=steps[j]+1
        print(max(steps))
    except:
        break



发表于 2021-04-06 17:41:37 回复(0)
def findIndex(res, tar):
    left = 0
    right = len(res)-1
    while left<=right:
        mid = (left+right)//2
        if res[mid]>tar:
            right = right - 1
        elif res[mid]<tar:
            left = left + 1
        else:
            return mid
    return left
def funs():
    while True:
        try:
            num = int(input())
            ret = list(map(int, input().split()))
            res = []
            for tmp in ret:
                if len(res)==0 or tmp>res[-1]:
                    res.append(tmp)
                else:
                    index = findIndex(res, tmp)
                    res[index] = tmp
            print(len(res))
        except:
            break
funs()
编辑于 2021-04-04 23:22:04 回复(0)
while True:
    try:
        total = int(input())
        nums = list(map(int, input().split()))
        f = []
        f.append(1)
        max_steps = 1
        for i in range(1, len(nums)):
            f.append(1)
            for j in range(0, i):
                if nums[j] < nums[i]:
                    f[i] = max(f[i], f[j]+1)
            max_steps = max(f[i], max_steps)
        print(max_steps)
    except:
        break
发表于 2021-03-29 13:45:54 回复(0)
抄前面大佬的作业
while True:
    try:
        n=int(input())
        list1=list(map(int, input().split()))
        db=[1]*n
        for i in range(len(list1)):
            for j in range(i):
                if list1[j]<list1[i]:
                    db[i]=max(db[i], db[j]+1)
            m=max(db)

        print(m)
    except:
        break
发表于 2021-03-27 15:52:47 回复(0)
def scan_index(input_list,index_value):
    result = []
    for k,v in enumerate(input_list[:index_value]):
        if v<input_list[index_value]:
            result.append(k)
    return result
while True:
    try:
        input_len = len(input())
        input_value =input().split()
    except:break

    max_dict = {}
    input_value = list(map(int,input_value))
    for k,v in enumerate(input_value):
        v_min_index = scan_index(input_value,k)
        if len(v_min_index)==0:
            max_dict[k]=1
        else:
            max_dict[k] = max([max_dict[j] for j in v_min_index])+1
    print(max(max_dict.values()))
        
动态规划求解,遍历数字,当遍历的为最后一位时,找到前面比它小的数字,如果有比它小的数字,则在小的里面,max(以前面小数字为结尾的最长子序列的长度值)+1作为该index的最大值,如果没有则为1

发表于 2021-02-09 10:51:56 回复(0)
dp = dict()
def getMaxSub(lst, minNum):
    tup = tuple(lst)
    outer = (tup, minNum)
    if outer in dp:
        return dp[outer]
    #print('This is lst: {}'.format(lst))
    if len(lst) == 1:
        if minNum == None or minNum < lst[0]:
            dp[outer] = 1
            return 1
        dp[outer] = 0
        return 0
    if minNum == None:
        num = max(1 + getMaxSub(lst[1:], lst[0]), getMaxSub(lst[1:], None))
        dp[outer] = num
        return num
    else:
        cur = lst[0]
        if cur > minNum:
            num = max(1 + getMaxSub(lst[1:], cur), getMaxSub(lst[1:], minNum))
            dp[outer] = num
            return num
        else:
            num = getMaxSub(lst[1:], minNum)
            dp[outer] = num
            return num

lst = []
while True:
    try:
        input()
        string = input()
        string = string.split()
        newLst = []
        for i in string:
            newLst.append(int(i))
        lst.append(newLst)
    except:
        break

for i in lst:
    print(getMaxSub(i, None))

给一个python的解法。本身就是一个recursion,一开始不用dp会timeout,原因是getMaxSub(sublist, None) 出现次数过多,造成重复运算。所以用dictionary做了一个简易dp

发表于 2021-01-02 17:13:10 回复(0)
import bisect


while True:
    try:
        n, nums = int(input()), map(int, input().split())
        temp = []
        for i in nums:
            pos = bisect.bisect_left(temp, i)
            if pos == len(temp):
                temp.append(i)
            else:
                temp[pos] = i
        print(len(temp))
    except:
        break

发表于 2020-12-19 19:05:05 回复(0)
while True:
    try:
        n = int(input())
        s = input().split()
        s = [int(i) for i in s]
        res = []
        for i in range(len(s)):
            c = 1
            a = s[i]
            if i+1 < len(s):
                tem = sorted(s[i+1:])
            else:
                res.append(c)
                break
            for j in tem:
                if j > a:
                    a = j
                    c += 1
            res.append(c)
#         print(res)
        print(max(res))
    except:
        break
为啥不能通过???自己列举的数据都正确
编辑于 2020-12-15 19:21:32 回复(0)
最长升序子序列。动态规划。合唱队列那题很像。
import bisect


def max_order(lists):
    list_num = []
    list_max = []
    for i in lists:
        # bisect_left把i插入list_num,使得list_num还是升序,返回index。insort才是就地插入
        local = bisect.bisect_left(list_num, i)
        if local == len(list_num):  # 最后一个
            list_num.append(i)  # 最大值放最后
            list_max.append(local + 1)  # 记录每个元素插在哪个位置了
        else:
            list_num[local] = i  # 不是最大就替换,给后面更多机会
            list_max.append(local + 1)  # 记录每个元素插在哪个位置了
    return list_max


while True:
    try:
        people_num = int(input())
        height_list = list(map(int, input().split()))
        result_1 = max_order(height_list)  # 升序最长
        
        print(max(result_1))
    except BaseException as er:
        break


发表于 2020-11-20 13:41:05 回复(0)
# 确定状态 最后一步a[j]
# 1. 最优策略中的最长上升子序列就是{a[j]} 答案是 1
# 2. 子序列长度大于 1,那么最优策略中,a[j] 前一个元素是 a[i] 且 a[i] < a[j]
# 因为是最优策略,那么以 a[i] 结尾的子序列一定是最长的
# 不知道 a[i] 是哪一个,所以枚举每个 i 
# 问题变为求 以a[i] 结尾的最长子序列
# 得出状态 f[j] = 以 a[j] 结尾的最长子序列的长度
# 转移方程 f[j] = max{1, f[i] + 1 且 i<j and a[i] < a[j]}
# 计算f[0] f[1] ......f[n-1] 然后取最大值
while True:
    try:
        n, A = int(input()), list(map(int, input().split()))
        if n <= 0:
            print('0')
        else:
            res = 0
            f = [1] * n
            for j in range(n):
                for i in range(j):
                    if A[i] < A[j] and f[i] + 1 > f[j]:
                        f[j] = f[i] + 1
                res = max(res, f[j])
            print(res)
    except:
        break
        

发表于 2020-10-22 16:38:39 回复(0)
while True:
    try:
        a, b = int(input()), list(map(int, input().split()))
        size = len(b)
        dp = [1]*size
        for i in range(1, size):
            for j in range(i):
                if b[i]>b[j]:
                    dp[i]=max(dp[i],dp[j]+1)
        print(max(dp))
    except:
        break

import bisect
while True:
    try:
        a, b = int(input()), map(int, input().split())
        q = []
        for v in b:
            pos = bisect.bisect_left(q, v)
            if pos == len(q):
                q.append(v)
            else:
                q[pos] = v
        print(len(q))
    except:
        break
# 凡哥作品
#解释:
#相当于维护一个结果数组,如果当前元素比结果数组的值都大的的话,就追加在结果数组后面
#(相当于递增序列长度加了1);否则的话用当前元素覆盖掉第一个比它大的元素
#(这样做的话后续递增序列才有可能更长,即使并没有更长,这个覆盖操作也并没有副作用哈,
#当然这个覆盖操作可能会让最终的结果数组值并不是最终的递增序列值,这无所谓)
#https://leetcode-cn.com/problems/longest-increasing-subsequence/comments/284831


编辑于 2020-09-09 01:34:37 回复(0)
求问为什么自测可以通过,保存并调试就过不了呢?
while True:
    try:
        n = int(input())
        l = [int(input()) for _ in range(n)]
        dp = [1]*n
        for i in range(n-2,-1,-1):
            for k in range(i+1,n):
                if l[i] < l[k] and dp[i] < dp[k]+1:
                    dp[i] = dp[k]+1
        print(max(dp))
    except:
        break

发表于 2020-08-31 22:33:36 回复(0)
自测用例可以通过,为什么提交就是错误,大神们帮忙看下
def GetResult(lst_num):
    n = len(lst_num)
    lst_result = []
    for loop in range(n):
        index1 = 0
        lst_new  = lst_num[loop:]
        first = lst_new[0]
        lstnew = list(set(lst_new))
        index1 = lstnew.index(first)
        lst_result.append(len(lstnew) - index1)
    return max(lst_result)
 
while True:
    try:
        n=int(input())#几个点
        str_input=input().split()
        lst_num=[int(v) for v in str_input]# 输入的数组成的集合
        # l=[2,5,1,5,4,5]
        # print(l)
        ans=GetResult(lst_num)
        print(ans)
    except:
        break
发表于 2020-07-25 16:08:07 回复(0)
n = int(input())
line = list(map(int,input().split()))
maxStep = [1]
for i in range(1, n):
    res = 1
    for j in range(0, i):
        if line[j] < line[i]:
            res = max(maxStep[j]+1, res)
    maxStep.append(res)

largest=max(maxStep)  
print(largest)

发表于 2020-06-22 16:46:13 回复(0)
"""
Create Time: 2020/6/15 10:59
Author: FengkaiXiao
"""
"""
Create Time: 2020/6/15 10:59
Author: FengkaiXiao
"""
import bisect
def meihuazhaung():
	while True:
		try:
			a, b = int(input()), map(int, input().split())
			q = []
			for v in b:
				pos = bisect.bisect_left(q, v)
				if pos == len(q):
					q.append(v)
				else:
					q[pos] = v
			print(len(q))
		except:
			break
meihuazhaung()

发表于 2020-06-15 16:32:23 回复(0)
s=int(input())
l,o=[],[]
while s>0:
    n=int(input())
    l.append(n)
    s-=1
for i,j in enumerate(l):
    a=l[i+1:]
    b=[j]
    for k in a:
        if k>b[-1]:
            b.append(k)
        else:
            break
    o.append(len(b))
print(max(o))


发表于 2020-06-06 18:20:26 回复(0)
while True:
    try:
        n = int(input())
        container = []
        container = input().split()
        container = [int(x) for x in container]
        dp = [0]*n
        dp[-1] = 1
        res = []
        for j in range(n-2,-1,-1):
            temp = [] 
            for k in range(j,n):
                if container[k] > container[j]:
                    temp.append(1+dp[k])
            if len(temp) == 0:
                temp.append(1)
            dp[j] = max(temp)
        print(max(dp))
    except:
        break

发表于 2020-04-19 22:58:35 回复(0)