
C语言
Liaring
这个作者很懒,什么都没留下…
展开
-
动态规划矩阵求和
一.矩阵链事例矩阵链问题主要涉及的时在多个矩阵相乘,如何通过相乘的顺序来减少程序运行。这次分析过程按照动态规划的三个基本条件来逐步解答:1、寻找最优子结构:假设我们已经找到父矩阵链最优解,当我们划分到最后一步时都是两个子矩阵链(分别被括号包围)相乘,如(A1A2A3A4)(A5A6A7),此时显然外括号为父矩阵的最优括号划分。继续往下划分,((A1A2A3)A4)(A5(A6A7)),则两个子矩阵链的划分括号必须也为他们本身的最优括号划分。因为如果子矩阵链的划分括号不是他们本身的最优括号划分时,两个原创 2021-02-12 16:29:03 · 385 阅读 · 0 评论 -
贪心算法prim算法
普利姆算法(Prim):算法思想基于顶点选择,通过维护两个点集,已选点集S和未选点集T,每次选择从S集映射到T集的最小代价边,适用于稠密图。图解dis更新过程:最短路径求解时,dis更新的都是以北京为起点,prim算法起点始终是从S集合出发向T集合连线,也就是dis表中找到权值最小的那个点,放入S集合中。#include"stdafx.h"#include<iostream>#define INF 10000using namespace std;const int N =原创 2021-05-29 19:59:58 · 967 阅读 · 0 评论 -
贪心Kruskal算法
贪心Kruskal算法此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。1. 把图中的所有边按代价从小到大排序;2. 把图中的n个顶点看成独立的n棵树组成的森林;3. 按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小 生成树的一条边,并将这两颗树合并作为一颗树。4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。5. int findFather(int x)原创 2021-05-29 20:00:32 · 341 阅读 · 0 评论 -
单源最短路径贪心算法
单源最短路径算法贪心思想:单源最短路径即是寻找一个点到各各点的距离,首先需要去用一个数组dis去保持起始点到最近点的路劲(即权),由出发点去找最近点的最短路径,再由这个找到的最近点去找和他连的路径,如果这个点的到最近点的距离小于已经在dis数组中保持的,就去更改dis数组,下面是图演示:这是保存在e[][]这个二维数组里的值:#include"stdafx.h"#include <stdio.h>#include<iostream>using namespace s原创 2021-05-29 20:00:58 · 4941 阅读 · 1 评论 -
贪心背包问题v/w
标题贪心算法的基本思想是:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。背包问题用贪心算法来解决,每次选择利润v/w最大的物品装进背包,这样就使得目标函数增加最快,当最后一种物品放不下时,选择一个适当的,使物品装满背包,使得总的价值最大。设计背包问题是一个有很多中答案的问题,可以用动态规划和贪心算法来求解。用贪心算法来解决问题是相当方便和快捷的。对于一些特定的问题,要找到最佳解,一般的思路是先列出所有解,然后找到最佳解。利用贪心算原创 2021-05-29 20:01:22 · 163 阅读 · 0 评论 -
循环赛日程表(分治)
问题描述设有 n = 2的k次方 个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各自赛一次。(2)每个选手一天只能赛一次。(3)循环赛一共进行n-1天。算法设计按分治策略,我们可以将所有的选手分为两半,n个选手的比赛日程表可以通过n/2个选手设计的比赛日程表来决定。递归地用这种一分为二的策略对选手进行分割,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。#include "stdafx.h"原创 2021-03-08 12:31:10 · 622 阅读 · 0 评论 -
动态规划最大子矩阵和问题
最大子矩阵和问题(1)问题描述:给定一个m行n列的整数矩阵A,试求A的一个子矩阵,时期各元素之和为最大。(2)问题分析:用二维数组a[1:m][1:n]表示给定的m行n列的整数矩阵。子数组a[i1:i2][j1:j2]表示左上角和右下角行列坐标分别为(i1,j1)和(i2,j2)的子矩阵,其各元素之和记为:最大子矩阵问题的最优值为。如果用直接枚举的方法解最大子矩阵和问题,需要O(m2n2)时间。注意到,式中,,设,则容易看出,这正是一维情形的最大子段和问题。因此,借助最大子段和问题的动态原创 2021-05-29 20:02:06 · 1080 阅读 · 0 评论 -
动态规划一维数组
问题描述:给定一个数组,记录一串数字,可正可负,现要求出其中最大的连续子段和。用数组A[N]记录所要求的数组,用数组B[N]来记录连续子段和的状态通过分析,可以知道:当B[K]>0时,无论B[K]为何值,B[K]=B[K-1]+A[K]当B[K]<0时,也就是B[K]记录到一个A[J]是负的,可以把B[K]变成负的,那么B[J]记录的这一段应该截掉,应为无论后面的A[K]多大,加上个负数总不可能是最大的子段和,因此将B[K]=A[K],重新开始记录。故动态转移方程便可得出B[K]原创 2021-05-29 20:01:44 · 340 阅读 · 0 评论 -
动态规划最长公共子序列
最长公共子序列,英文为Longest Common Subsequence,缩写LCS。一个序列,如果是某两个或多个已知序列的最长子序列,则称为最长公共子序列。另外,要注意的是最长公共子序列与最长公共子串不一样,下面看一个例子就明白。有序列S1和S2,其中S1=hello,S2=hero。那么最长公共子序列为heo,而最长公共子串为he。可以看到区别就在于一个允许不连续,一个要求必须连续,而共同特点就是都要保持顺序性。标题动态规划。一般在能用动态规划解决的问题需要符合三个特征:最优子结构、重叠子问题原创 2021-02-18 21:26:49 · 189 阅读 · 0 评论 -
动态规划矩阵连乘备忘录
备忘录是动态规划算法的变形﹒备忘录方法也是用表格保存已解决子问题的答案﹒与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的.因此,备忘录方法的控制结构与直接递归方法的控制结构相同,而区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解.备忘录方法为每个子问题建立一个记录项,并初始化为一个特殊值表示该子问题尚未求解﹒在求解过程中,对每个待求的子问题,首先查看其相应的记录项,如若记录项仍为初始化时的特殊值,则表示该子问题尚未求解,原创 2021-02-18 21:23:06 · 489 阅读 · 0 评论 -
线性时间选择问题
线性时间选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,(这里给定的线性集是无序的)。1、随机划分线性选择线性时间选择随机划分法可以模仿随机化快速排序算法设计。基本思想是对输入数组进行递归划分,与快速排序不同的是,它只对划分出的子数组之一进行递归处理。// test.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include <iostream> #include <ctime>usin原创 2021-01-11 18:52:04 · 955 阅读 · 0 评论 -
推箱子
推箱子的思想推箱子其实就是一个二维数组,在二维数组中进行判断,当玩家和空地和箱子和成功点的不断变化,而你只需要对玩家能操作的进行编写,就可以推动,而返回就需要对推动的方向和是否推动箱子进行判断,这样你就可以用栈来保存。#include <iostream>#include <conio.h>#include<vector>#include<fstream>using namespace std;int Map[10][10];//记录玩家的坐标原创 2020-12-17 13:51:48 · 770 阅读 · 0 评论 -
快速排序
快速排序是采用了一种分治的策略,通常称其为分治法。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:以一个数组作为示例,取区间第一个数为基准数。void Swap(int *n, int *m){ int temp; te原创 2020-12-15 16:06:16 · 897 阅读 · 0 评论 -
棋盘覆盖
分治法之棋盘覆盖问题在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)原创 2020-12-11 18:36:44 · 252 阅读 · 0 评论 -
多态性(图形的面积)
多态性2(图形的面积) 定义一个形状类shape,将它作为基类派生出类:circle(圆)、triangle(三角形)和rectangle(长方形)。分别定义这些派生类并且定一个虚函数来计算各个形状的面积。#include #include<math.h>#includeusing namespace std;///基类Shap...原创 2019-11-03 21:22:22 · 903 阅读 · 0 评论 -
C++:多态性(动态联编测试)
题目描述有一个名为Shape的基类,它有2个派生类:Circle(圆)和Rectangle(长方形)。测试程序如下:int main(){ double x,y,r,x2,y2;Shape *p;while (cin>>x>>y>>r){ p=new Circle(x,y,r); p->print();cin>>x&g...原创 2019-10-30 23:08:30 · 512 阅读 · 0 评论 -
二分法查找
加粗样式当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。实现过程假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.1.开始令front=0(指向3原创 2021-01-11 16:11:10 · 197 阅读 · 0 评论 -
最近点对问题
分治——最近点对问题问题描述n个点在公共空间中,求出所有点对的欧几里得距离最小的点对。分治法求解分解对所有的点按照x坐标(或者y)从小到大排序(排序方法时间复杂度O ( n l o g n )。根据下标进行分割,使得点集分为两个集合。解决递归的寻找两个集合中的最近点对。取两个集合最近点对中的最小值m i n ( d i s l e f t , d i s r i g h t )。合并最近距离不一定存在于两个集合中,可能一个点在集合A,一个点在集合B,而这两点间距离小于dis。有已原创 2021-01-06 15:44:40 · 759 阅读 · 0 评论 -
栈方法 做迷宫
原理:通过栈的原理 先进后出 后进先出通过对迷宫的不断查找找到最好的//图的搜索策略解决迷宫问题#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量#define OVERFLOW ...原创 2019-10-28 22:40:19 · 1321 阅读 · 1 评论 -
关于栈的方法 做狼羊白菜
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1#define OVERFALSE -2#define STACK_INIT_SIZE 1...原创 2019-10-27 20:47:11 · 305 阅读 · 0 评论 -
关于链式结构
@关于链式结构做一元多项次的加法和乘法#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFALSE -2typedef int Status;typed...原创 2019-10-26 22:52:03 · 414 阅读 · 0 评论