算法改进
在实践中逐渐一步步优化自己的算法也是一种享受
练过几年代码,有备而来
可以有遗憾,但绝不会后悔。
展开
-
动态规划——0-1背包问题
背包问题可以说是最典型的动态规划问题,从mooc上看了北航的算法课这一部分的讲解,感觉印象有进一步的加深,他把这一种方法叫做备忘录型。其实本质上我感觉就是利用计算机实现了一个数学表格的一步步推算。最大的思想就是装还是不装。还有就是动态规划较蛮力枚举的好处不仅仅体现在算法时间复杂度上的提升,还有就是方便了决策重现,输出每一种较为具体的情况。源码如下附上:#include<iostream>#include<bits/stdc++.h>using namespace std;原创 2021-11-20 16:11:55 · 294 阅读 · 0 评论 -
回溯——伯努利装错信封问题
这一道题与回溯法写的排列组合是很类似的,只是多了第一个的约束条件的限制,就是除了选出来的数都能相同,而且第i个数也不能等于它本身的自然位。对于回溯思想的解读,可见回溯法求解排列组合运行结果:源码这里暂时不予给出,有需要的话,可以评论区留下自己的邮箱。(因为是作业,害怕自己出现类同代码。)预计11月底,进行给出。最强剑道:受尽苦难,不负野心,冲...原创 2021-11-19 09:02:23 · 1231 阅读 · 0 评论 -
回溯求解排列组合(求源码评论区留言)
回溯求解排列组合的关键在于两点:一是要明白回溯的思想到底是什么二是要考虑清楚什么时候进行向下探索,什么时候碰壁回头,什么时候到达回溯的重点,退出循环。也就是回溯过程中的约束条件回溯思想:向前走,碰壁回头回溯的一般形式如下:以求解排列A(n,m)位例,这里解释一下排列的约束条件:1.第一个约束条件就是选出的数不一样。2.每一个数都小于等于n。3.选够m个数即进行输出。4.向下探索,向上回溯。至于组合,只需要在排列的第一个条件上加上一个固有的顺序要求就o了。运行截图:源码这里暂时不予原创 2021-11-18 22:11:09 · 405 阅读 · 0 评论 -
爬楼梯(递归——奇数步,偶数步扩展)
题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?思路:采用递归的思想,最后一步可以爬1个或者两个台阶,所以可以得出递归关系:爬n阶台阶的爬法等于爬(n-1)阶台阶和(n-2)阶台阶的爬法之和。即,f(n)=f(n-1)+f(n-2).这里也不难看出递归出口是n为1和2的时候,代码如下,可供参考:int fun(int n) //爬楼梯总的方法数 { if(n==1) { return 1; }原创 2021-11-16 15:06:52 · 1504 阅读 · 0 评论 -
递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)
话不多说,先上源码:阶乘:#include<iostream>#include<bits/stdc++.h> using namespace std;int JieCheng(int n);int main(){ int n; cin>>n; cout<<n<<"的阶乘是:"<<JieCheng(n)<<endl;}int JieCheng(int n){ int s; if(n==1)原创 2021-11-15 08:44:11 · 145 阅读 · 0 评论 -
最长非降子序列(动态规划dp dynamic programming)
首先要理解一下什么叫做非降子序列非降子序列,简单来说就是指给出一个数字序列,在不改变整体顺序的情况下摘出几个来组成一个子序列,这个序列满足从小到大的排序顺序。所以,最长非降子序列,不难理解就是从这些子序列中挑出一个最长的子序列。求解最长非降子序列长度思路:总体思路就是倒着看,去看分别以每一个元素开头的最长非降子序列的长度,如果前面的数小于后面的某一个数,那么它的最长非降子序列长度就是后面那个数的最长非降子序列长度加一,找出最长的给它赋值。核心:a.初值 最后一个元素的最长非降子序列长度为1.原创 2021-11-11 15:30:36 · 1900 阅读 · 0 评论 -
找零问题的几种解决方式(递推)(持续更新)
初学算法,找零问题算的上是一个比较经典的问题老师上课讲的时候潇潇洒洒,以为已经是拿下了,课下唯唯诺诺,一看,发现思路没了,真是出来混,总是要还的呀。源码:#include<iostream>#include<bits/stdc++.h>using namespace std;int den[7]={0,1,2,5,10,20,50}; //定义分配数组int fun(int n,int i); int main(){ int n; int count=原创 2021-11-07 16:23:00 · 1676 阅读 · 1 评论 -
测试程序运行时间
在初步学习算法的时候,都喜欢一个词叫优化算法,经常做的事情就是比较两个实现同种功能的程序的运行时间。测试运行时间的函数,这就来安利一波。1.时间函数头文件 #include<time.h>2.设置初始时间和结束时间的变量。int begin,end;double begin,end;(名字不限,表达出相关意思即可)(类型不限,根据你最终需要运行时间的类型设定即可)3.输出测试时间 end-begin.#include<iostream>#include<t原创 2021-09-12 07:32:33 · 780 阅读 · 0 评论 -
1到n阶乘算法的改进
1到n阶乘算法的改进之前用到过好几次了,但总是很长时间不用就会忘了,所以这次直接把它扔进来了。之前总是喜欢用双层循环,其实一个单层循环足以,下面将用Python和C++两种语言进行展示C++:#include<iostream>using namespace std;int main(){ int sum=0,tmp; for(int i=1;i<=10;i++) { tmp=1; for(int j=1;j<=i;j++) tmp*=j; sum原创 2021-01-21 11:20:18 · 355 阅读 · 0 评论