最长子序列和 动态规划python_算法基础之python实现动态规划中数字三角形和最长上升子序列问题...

数字三角形问题:python

问题描述:函数

问题分析:spa

程序代码:(递归法和动归法)code

# -*- 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))

最长上升子序列问题:blog

问题描述:递归

问题分析:utf-8

程序代码:input

# -*- 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))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值