【python学习笔记】2:收集最多价值奖品问题
来源:互联网 发布:女朋友胸很大知乎 编辑:程序博客网 时间:2024/06/05 00:41
题目描述:假设有一个6x6的棋盘,每个格子里有一个奖品(每个奖品的价值在100到1000之间),现在要求从左上角开始到右下角结束,每次只能往右或往下走一个格子,所经过的格子里的奖品归自己所有。问最多能收集价值多少的奖品。
这是一个递推的问题,因为到达最后一个格子必须经过其上的格子或者其左的格子,所以到达这个格子最多能收集的奖品价值是左侧和上侧格子所能收集的奖品的最大价值(如果没有这个格子,就是0)中的较大者加上自身所在格子的奖品价值。而递推的入口在于到达[0][0]的奖品最大价值即为[0][0]本身的价值。有了递推表达式,也有了递推的入口,从而可以打表递推求解。
*递推求解
import randomList_vex=[[random.randint(100,1000) for i in range(6)] for j in range(6)] #生成随机的奖品图print("生成的奖品价值图打表为")for i in range(6): print(List_vex[i]) #逐行输出看一下print("\n")List_maxpath=[[0 for i in range(6)] for j in range(6)] #这张图上的点表示到这点能获得的最大奖品值for i in range(6): for j in range(6): List_maxpath[i][j]=max(List_maxpath[i-1][j] if i>0 else 0,List_maxpath[i][j-1] if j>0 else 0) + List_vex[i][j]print("从[0][0]到每个点最多获取的奖品价值打表为")for i in range(6): print(List_maxpath[i]) #逐行输出,矩阵最右下角的点值为所求print("\n走到右下角的点最多获取的奖品价值为",List_maxpath[5][5])
运行结果:
再运行一次:
random.randint(100,1000)用于随机生成100~1000之间的随机数,这里利用了列表推导式的方式将其用于生成列表的每一个元素。
List_maxpath[i-1][j] if i>0 else 0
相当于C/C++中的三目运算
i>0 ? List_maxpath[i-1][j] : 0
表示如果其上侧存在格子,就取到达那个格子的奖品最大价值数,否则取0,同样地对于其左侧的格子也是一样的道理。因为递推总是基于左侧和上侧的格子,因此循环也必须按照从左到右&从上到下(或者从上到下&从左到右)的顺序来进行。对每一步利用python内置的函数max()取了到达左侧和上侧格子的价值最大值,再与自身格子的奖品价值相加,完成一次递推。显然最终得到的点List_maxpath[5][5]即为所求。
是我不够好。
继续努力就是。
0 0
- 【python学习笔记】2:收集最多价值奖品问题
- 【C++收集问题】学习笔记
- 习题8-4 奖品的价值 UVa11491
- 奖品的价值 Erasing and Winning
- 提升网页价值-学习笔记
- Python 问题收集贴
- python 学习笔记-----编码问题
- Python学习笔记 --- 编码问题
- Python学习资料收集
- Python学习资料收集
- python学习网址收集
- Python学习资料收集
- Python学习视频收集
- python学习资源收集
- Python学习资料收集
- uva 11491 Erasing and Winning 奖品的价值 (单调队列)
- UVA11491:Erasing and Winning(奖品的价值)
- [UVa 11491] 奖品的价值(Erasing and Winning)
- 初学PHP
- all数组
- 翻转二叉树
- 判断回文
- Spring学习-20:Spring的AOP:自动代理
- 【python学习笔记】2:收集最多价值奖品问题
- bootstrap-table的toolbar用法自定义增删改查工具容器
- anchors数组
- 链表基础之翻转,删除
- 表单基础
- 框架的创建
- SIM900A与网络调试助手进行TCP收发通信
- Android Studio 创建窗口默认继承Activity而非AppCompatActivity
- 删除下拉列表中的选项