ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Acwing1015. 摘花生 python实现

2022-05-17 18:35:12  阅读:151  来源: 互联网

标签:一步 python max 最大值 花生 range Acwing1015 dp


题目描述

给定一个矩阵,矩阵中元素的值表示花生的个数
从左上角走到右下角,只能向右走或者向下走,问能采到的花生最大值是多少

典型的数字三角形模型,求最大路径和

题目思路

  1. 从集合角度考虑DP问题
  • 状态表示\(f[i,j]\)

    • 集合:从左上角点\((1,1)\)到\((i,j)\)的所有路线
    • 属性:最大值

    理解:集合表示\(f[i, j]\)涵盖的范围,属性表示\(f[i, j]\)的值,代表的是最大值

    因此题目的答案就是\(f[n,m]\)

  • 状态计算

    • 状态计算一般考虑的是走到该位置的最后一步是从哪里走的

    • 根据题意可知,走到\((i, j)\)的最后一步,要不就是从上面\((i-1, j)\),要不就是从下面\((i,j-1)\)走过来的

    • 要求f[i,j]的最大值,可以通过求上一步的最大值+从上一步到\((i, j)\)的值【这样使得求解范围变小】,那上一步的最大值怎么求?其实就是状态的定义\(f[i-1,j]\)和\(f[i,j-1]\),有两个“上一步”,那就看哪一步的结果更大,选哪一步了

    • 因此,状态的计算可以归纳为:

      \(f[i,j]=max(f[i-1,j]+g[i,j],f[i,j-1]+g[i,j])\)

      简化写就是 \(f[i,j]=max(f[i-1,j],f[i,j-1])+g[i,j]\)

  1. 剩下就是考虑初始化和遍历顺序的问题了。

    • 由于是从1开始计数的,因此可以利用初始化而不用去特判边界。我是根据边界应为\(f[1,1] = g[1,1]\),而\(f[1,1] = max(f[0,1] , f[1,0]) + g[1,1]\) 可知,应将\(f\)初始化为0

    • 从状态计算可以得知,要知道前面的结果才能推出后面的,因此应从上往下从左往右去遍历

代码实现

输入:

T组数据

行数R和列数C

R行C列花生个数

注意是从1开始计数的

输出:

花生数最大值

python3实现:

朴素做法,时间复杂度\(O(n^2)\):

t = int(input())
while t:
    # 读取数据
    n, m = tuple(map(int, input().split(" ")))
    g = [0 for _ in range(n)] 
    dp = [[0 for _ in range(m + 1)]for _ in range(n + 1)]
    for i in range(n):# 一行一行读
        g[i] = list(map(int, input().split(" ")))
    # dp
    for i in range(1, n+1):
        for j in range(1, m + 1):
            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + g[i - 1][j - 1]
    print(dp[n][m])
    t -= 1    

标签:一步,python,max,最大值,花生,range,Acwing1015,dp
来源: https://www.cnblogs.com/3-louise-wang/p/16281920.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有