数字三角形问题:
问题描述:
问题分析:
程序代码:(递归法和动归法)
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 14 16:35:43 2018
@author: lizihua
题目:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
如上三角形,找出一条从顶部到底部的路径,使得路径所经过的数字之和最大。
要求:每步只能向左下或右下走,最后输出这个最大和即可。
其中三角形的行数大于1小于等于100,数字为0~99
输入:第一行n代表三角形行数
接下来n行为三角形各行的数值 (函数从1开始数)
################递归法##################
#缺点:深度遍历每条路径,存在大量重复计算,复杂度为O(2^n),当n=100时,会超时
import numpy as np
n=int(input("请输入三角形行数:"))
D=np.zeros((n,n))
for i in range(n):
D[i]=input("请输入第"+str(i+1)+"行数值:").split(' ')
#将line中的元素转换为整型
D[i] = list(map(int, D[i]))
print(D)
def MaxSum(i,j):
if (i+1)==n:
return D[i][j]
x=MaxSum(i+1,j)
y=MaxSum(i+1,j+1)
return max(x,y)+D[i][j]
print(MaxSum(0,0))
"""
################动态规划法##################
#每次计算完MaxSum[i][j],都将其保存起来,下次用到,则直接调用,其复杂度为O(n^2)
import numpy as np
n=int(input("请输入三角形行数:"))
D=np.zeros((n,n))
for i in range(n):
D[i]=input("请输入第"+str(i+1)+"行数值:").split(' ')
#将line中的元素转换为整型
D[i] = list(map(int, D[i]))
print(D)
def MaxSum(i,j):
global maxsum
maxsum=np.ones((n,n))*(-1)
if maxsum[i][j]!=-1:
return maxsum[i][j]
if (i+1)==n:
maxsum[i][j]=D[i][j]
else:
x=MaxSum(i+1,j)
y=MaxSum(i+1,j+1)
maxsum[i][j]=max(x,y)+D[i][j]
return maxsum[i][j]
print(maxsum)
print(MaxSum(0,0))
最长上升子序列问题:
问题描述:
问题分析:
程序代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Mar 15 10:16:22 2018
@author: lizihua
题目:对于给定序列,求最长上升子序列的长度
"""
import numpy as np
n=int(input("请输入给定序列的长度N:"))
a=np.zeros(n)
maxLen=np.zeros(n)
a=input("请输入给定序列:").split(' ')
#将a中的元素转换为整型
a = list(map(int, a))
print(a)
for i in range(1,n):
for j in range(1,i):
if a[i]>a[j]:
maxLen[j]=max(maxLen[j],maxLen[j]+1)
print(max(maxLen))