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

数字三角形问题:

问题描述:


问题分析:


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

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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值