算法练习, 红白花放置方法数
题目是在做笔试时遇到的,考试时想的过于复杂,浪费的很多时间,然后考砸了。事后又想了想。。题目是大致回忆的,意思是在的。
题目描述
有红白两种花,白花需要连续k倍数放置,k大等于0。求长度区间[a,b]内的放置个数。
输入第一行为数据组数和k值,接下去是每组数据的区间长度
例
输入:
2 2
3 4
4 4
输出
8
5
说明:
第一组:“红红红”,“红白白”,“白白红”,“红红红红”,“红白白红”,“红红白白”,“白白红红”,“白白白白”
第二组:“红红红红”,“红白白红”,“红红白白”,“白白红红”,“白白白白”
解题思路:递归
fun(cur_pos,white_pos,length_rg)
因为长度是一个区间,函数内需要一个记录成功次数的参数:
success = 0
若 cur_pos 已在length_rg区间内并且截止当前位置已经满足要求:success += 1
递归出口:
cur_pos>=length[rg] return success
考虑当前应该放置的位置cur_pos,和前面最近的白花放置的位置white_pos。
1. (cur_pos - white_pos)%k == 0:
当前白花放置已经满足k倍要求,那么接下来分两种, (可以合并的,先不管):
a. 放置红花
success += fun(cur_pos+1, cur_pos+1,length) #白花位置更改
b. 放置白花
success += fun(cur_pos+1, white_pos,length) #这里white_pos也可以写成 cur_pos+1 ,是一个意思,方便理解先这样吧
2. (cur_pos - white_pos)%k > 0:
当前白花的放置不满足要求,当前位置只能放置白花:
success += fun(cur_pos+1, white_pos, length)
具体函数代码:
def fun(cur_pos, length_rg, white_begin, k):sucess = 0print(cur_pos,white_begin)if cur_pos >= length_rg[0]:if (cur_pos-white_begin)%k ==0:sucess += 1if cur_pos >= length_rg[1]:return sucessif (cur_pos-white_begin)%k == 0:#红sucess += fun(cur_pos+1,length_rg,white_begin+1)#白sucess += fun(cur_pos+1,length_rg,white_begin)return sucess
考试时的想法:排列组合
给定长度L,倍数K
假设k个白花为一组,那么白花出现的组数g: 0<=g<=int(L/k),红花出现的个数为:H = L-k*g
然后问题转化为在H个红花之间放置g组白花的方法数,即在H+1个位置中找出位置数。
然后主要考虑方法重复的问题:(然后把自己玩死了。。)
对于g组白花,可以选出1到g的位置进行放置,即将g组白花再进行分组
(1)选出1个位置放置g组白花:
(2) 选出2个位置。。
需要考虑将g组分成两组,分成数量不同的两组还是数量相同的两组。。
对于数量不同的,要使用
对于数量相同的,要使用
(3)选出3个位置。。。。
。
。
。
感觉这也是个方法。但是我没想通。递归的方法可能也不怎么秀但有解。考试的时候就认准了排列组合然后成了炮灰。
算法练习, 红白花放置方法数相关推荐
- 【算法-Java实现】 换钱的方法数(暴力递归法)
[算法-Java实现] 换钱的方法数(暴力递归法) 文章目录 [算法-Java实现] 换钱的方法数(暴力递归法) 一.问题描述: 二.问题解答: **举例:** **思路:==暴力递归==** 三.算 ...
- 算法53----换钱的最小次数和方法数【动态规划】
一.题目:换钱的最小次数 给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 举个 ...
- 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
第一题 给定一个数组,求子数组的最大异或和. 一个数组的异或和为,数组中所有的数异或起来的结果. 简单的前缀树应用 暴力方法: 先计算必须以i结尾的子数组的异或和,然后再计算机i+1的,以此类推... ...
- 算法:使用单词表拼接字符串的方法数
题目描述 假设所有字符都是小写字母. 长字符串是str arr是去重的单词表, 每个单词都不是空字符串且可以使用任意次 使用arr中的单词有多少种拼接str的方式,返回方法数. 题目解析 从左到右尝试 ...
- 算法3-加减号得数方法数
题目 给定一个数组arr,你可以在每个数字之前决定+或者但是必须所有数字都参与 再给定一个数target,请问最后算出target的方法数是多少? 每一个数都参与运算,运算符号只有±,最终能得出tar ...
- 试题 算法训练 车的放置(蓝桥杯c++)
问题描述 在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的) 输入格式 包含一个正整数n 输出格式 一个整数,表示放置车的方法数 ...
- 【工具】统计jar包和apk中的java方法数
2019独角兽企业重金招聘Python工程师标准>>> [工具]统计jar包和apk中的java方法数 :http://www.baidufe.com/item/5891ec6f73 ...
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
时之沙: http://blog.csdn.net/t12x3456 随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多 ...
- 【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )
文章目录 一.65535 方法数限制和 MultiDex 配置 二.多 DEX 加载引入 三.PathClassLoader 类加载源码分析 四.BaseDexClassLoader 类加载源码分析 ...
- 机器人达到指定位置方法数
题目:假设有排成一行的N个位置,标记为1-N,N一定大于或等于2.开始时机器人在其中的M位置上(M一定是1-N中的一个),机器人可以往左走或者往右走,如果机器人来到1位置,那么下一步只能往右来到2位置 ...
最新文章
- 刚开始Windows Mobile的开发,请大家多多关照
- 【紧急】支付宝全面停止微信合作
- Python 技术篇-win32、amd64结尾的whl库该选哪个,如何查看python平台支持
- tensowflow 训练 远程提交_一文说清楚Tensorflow分布式训练必备知识
- 【JAVA设计模式】外观模式(Facade Pattern)
- [html] 后缀.html和.htm有什么区别?
- 深度优化LNMP之Nginx [2]
- Oracle 自动生成的视图VM_NSO_1
- Steam注册遇到CAPTCHA问题,一直注册不了,一个简单的注册办法
- Python 递归函数计算阶乘
- 劣币驱逐良币,人吃人的中国职场环境还能走多远
- 感受野-Receptive Field的理解
- 一文详解知识图谱关键技术与应用 | 公开课笔记
- java计算机毕业设计夕阳红养老院系统源代码+数据库+系统+lw文档
- java虚拟机学习笔记——连接模型(第八章)
- 【C++ 程序】 Fractal Designer 0.2
- TOMCAT/JS/CSS/JavaWeb/浏览器老是加载缓存/谷歌浏览器/微软浏览器/刷新键都按烂了/无法加载样式解决办法之一
- 恶意劫持主页之强力修复法
- 【高通qdcm使用总结】
- web项目设置最小宽度
热门文章
- 读取dds文件转为opengl纹理
- 解决Proteus仿真时候提示Could not load simulator DLL错误
- 2021-12-28学习的道路是寂寞的,学成后的成绩是惊艳的。喜欢热闹是生物的本性,耐得住寂寞方显人性尊贵
- linux usr目录权限不够,linux-mkdir:无法创建目录“ /usr/local/n / versions”:权限被拒绝...
- 他一生仅凭252个字,就傲视千古…
- flash 不显示 旋转 补间动画_【图片】Flash入门5:详解制作补间动画(非传统补间)【flash软件吧】_百度贴吧...
- 对Python【返回函数与闭包】的一点思考
- c语言链表中next作用,C语言链表中q-next=p;表示什么意思?
- jQuery学习笔记之closest()
- 51单片机LCD1602液晶屏显示