动态规划
动态规划算法的实质是分治思想和解决冗杂,将待求解问题分解为更小的、相同的子问题,然后对问题进行求解,最终产生一个整体最优解。
-
0-1背包问题
目标函数: Max(Sum(xi*vi)),i=0...n,xi=0或1 约束条件: Sum(xi*wi)<=W xi=0或1 递归方程: c[0][j] = c[i][0] = 0 c[i-1][j] j<wi c[i][j] = { Max(c[i-1][j],c[i-1][j-wi]+vi) j>=wi 时间复杂度: O(n*W) 空间复杂度: O(n*W)
-
斐波那契数列
-
矩阵连乘问题 时:O(n) 空:O(n^2)
定义一个二维数组m存储最少乘法次数,二维数组s存储最优决策并分别初始化为0; 按照区间长度(即j-i)升序的原则,依次采用下式计算所有的m[i][j]和s[i][j]: m[i][j]=min{m[i][k]+m[k+1][j]+P[i-1]P[k]P[j]},i<=k<j 而s[i][j]设置为达到最小值的k值;根据从s[1][n]开始,从s的值依次构造最优解
-
游艇出租站
算法策略: 动态规划 思想:动态规划算法的实质是分治思想和解决冗杂,将待求解问题分解为更小的、相同的子问题,然后对问题进行求解,最终产生一个整体最优解。 数据结构: 二维数组dp[][]和r[][] 算法步骤: void rent(){ for(int d=3;d<=n;d++){//区间长度d for(int i=1;i<=n-d+1;i++){//状态起点i,终点j int j=i+d-1; for(int k=i+1;k<j;k++){//枚举决策点k if(dp[i][j]>dp[i][k]+dp[k][j]) dp[i][j]=dp[i][k]+dp[k][j]; } } } } 时间复杂度为O(n^3) 空间复杂度平均为O(logn),最坏为O(n)
贪心法
贪心法是指在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,通过若干次的贪心选择而得出最优解或较优解的一种方法
-
部分背包问题(阿里巴巴藏宝库)
存储数据结构: 一维数组m 一维数组v 贪心策略: 性价比(价值除以重量)最高的金币优先装入 算法步骤: 把这n堆金币按照性价比排序,然后遍历,如果背包中剩余可以拿的重量>=这堆金币重量,就全拿,否则装满为止。
-
加油站加油
输入: 加满油可行驶的公里数 输出: 加油站加油的次数 数据结构: 数组 算法设计策略: 贪心法--选择距自己最远的且能到达的加油站 自然语言:到站后的剩余油量能到下一站,不加油;到站后的剩余油量到不了下一站,若加了油后到得了,则加油,若加了油后还是到不了,则退出
分治算法
把一个复杂的大问题分成多个规模较小的相同子问题,子问题相互独立,递归求解各子问题,直到最后各子问题可以简单地直接求解为止,然后归并各子问题的解得原问题的解
-
快速排序
最坏的情况下,基准元素选取均为极端值,而每找一个基准元素,都需要O(子序列长度)的时间,故最坏 Tn = O(1),n=1 { T(n-1)+ O(n),n>1 Tn=O(n^2) 同理最好情况为中值 Tn = O(1),n=1 { 2T(n/2)+O(n),n>1 Tn=O(nlogn) 平均情况为 Tn=O(nlogn) 对于空间复杂度,与其递归深度相关,最好情况是中值 此时S(n)=O(logn),最坏为极值,此时S(n)=O(n),均值为O(logn)
-
二分查找
自然语言描述:在一串有序排列好的数据中取出中间值x[mid]与待查找值z进行比较,如果z小于中间值,则在0~x[mid]中再取中间值进行比较,如果小于中间值,则在x[mid]和最大值中再取中间值进行比较。重复该过程直至完成查找。 时间复杂度: O(logn) 空间复杂度: 最好为O(1),最差为O(logn)
回溯法
回溯法从初始状态触发,在隐式图中以深度优先的方式搜索问题的解,当发现不满足求解条件时,就回溯,并尝试其他路径
-
n皇后问题
时间复杂度:O(n^2) 空间复杂度:O(n!) 算法改进:利用约束条件和限界条件判断是否为可行解,从而避免了无效搜索,使时间复杂度变为O(n!)
-
地图着色问题
由于需要每点的每个邻接进行判断,以及给没上色的点上色,所以: 时间复杂度: O(n) 空间复杂度: O(n)