最长递增子序列(LCS)
给定一个序列 An = a1 ,a2 , ... , an ,找出最长的子序列使得对所有 i < j ,ai < aj 。求出这个子序列的长度
思路自记
这个题的思路我原来理解的是,子序列就不能有断啊,但这道题就是在一个序列中,所有的数,只要能排成个递增子序列的都算。
这道题相比于动态规划的难度小,就在于递增子序列,跟序列的第一个值密切相关,换句话说,第一个值决定了整个序列能排多长,那么,我只要对每一个值都作为一个序列的首值来排列,就可以得到了所有的情况,那么对应序列长度最长的,就是答案。
for i in range(len(arr)):
tmp = arr[i]
num = 1
for j in range(i+1,len(arr)):
if tmp < arr[j]:
num += 1
maxval = max(num, maxval)
tmp = arr[j]
最后,还要考虑一种情况就是当输入序列数原本就只有1的情况下,那么输出也是1,但这种思路和上面的不适用,需要另外设置一下:
if len(arr) == 1:
print '1'
else:
print maxval
完整代码
arr = map(int, raw_input().split(' '))
num = 1
maxval = 0
for i in range(len(arr)):
tmp = arr[i]
num = 1
for j in range(i+1,len(arr)):
if tmp < arr[j]:
num += 1
maxval = max(num, maxval)
tmp = arr[j]
if len(arr) == 1:
print '1'
else:
print maxval
最大子序列
输入包括一行,一个字符串s,字符串s长度length(1 ≤ length ≤ 50)。s中每个字符都是小写字母。输出一个字符串,即字典序最大的s的子序列。
思路自记
我刚开始理解的时候,特别费解,如果要字典序最大的子序列,那我直接就把原始输入序列给保留了,那不就是最大的吗?后来,才明白,他也是想要一种最大字典序递增的排序,那思路就是,我先从原始序列中找到当前出现的字典序最长的元素,保留,再从这个元素后到整个序列结尾,再找字典序最大的,一直这样,直到把序列给遍历完,那保留的所有元素,就是最大的字典序子序列了。
完整代码
arr = raw_input().strip()
out = []
maxval = 0
while arr:
maxval = max(arr)
out.append(maxval)
arr = arr[arr.index(maxval)+1:]
print ''.join(out)
给定整数序列求连续子串最大和
给定无序整数序列,求连续非空子串最大和,例如{-23 17 -7 11 -2 1 -34},子串为{17,-7,11},最大和为21
思路自记
这题类似于找最大字串,就是设定一个起始,一个中止,反复循环就行了,唯一特别坑的地方就是,要考虑负数的情况,如果最后算出来的最大和,是负数,那么就说明这个最大和是小于零的,对负数而言,越接近零的值越大,那对于最大和为负的情况下,只要把最大的负数输出,就是这个串的最大和了。
完整代码
arr = map(int, raw_input().split(' '))
tmp = 0
maxval = 0
ss = []
for i in range(len(arr)):
tmp = arr[i]
if tmp < 0:
ss.append(tmp)
for j in range(i+1,len(arr)):
tmp += arr[j]
maxval = max(tmp, maxval)
if len(arr) == 1:
print arr[0]
else:
if maxval > 0:
print maxval
else:
print max(ss)
01序列(暂)
给定一个数组metrix,数组中只包含1和0,且数组中的1都不相邻,输入一个数n,问能否在将数组中n个0替代换成1后不破坏1都不相邻的条件。
例1 metrix=[1,0,0,0,1],n=1输出true
例2 metrix=[1,0,0,0,1],n=2输出false
思路自记
我觉得我的思路没问题,在线下的IDE也没报错,但提交的时候,就是不行,我的思路是这样的:从头开始遍历,如果当前数是0,且这个数的前后数都是0,那么就把这个数置为一,同时将标志位置位true。接着,n是几,就执行这个的过程几次,后面的用前面更新好的序列进行,并且,每次都把flag位置初始为false。
完整代码
m = input()
num = map(int, raw_input().split(' '))
n = input()
while n > 0:
flag = False
for i in range(1,len(num)-1):
if num[i] == 0:
if num[i-1] == num[i+1] == 0:
num[i] = 1
flag = True
n = n - 1
if flag == True:
print 'true'
else:
print 'false'
疯狂序列(暂)
东东从京京那里了解到有一个无限长的数字序列: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, ...(数字k在该序列中正好出现k次)。东东想知道这个数字序列的第n项是多少,你能帮帮他么
思路自记
我自己想的比较粗暴,直接两个循环,第一个统计出现的数k,第二个统计出现k次过程中的项序变化,一直累加,直到等于n的时候,把对应的k输出。
完整代码
n = input()
num = 0
if n > 2:
for i in range(n):
for j in range(i):
num += 1
if num == n:
print i
break
elif n == 1:
print 1
elif n == 2:
print 2