算法分析与设计
K.SHI
在读学生~ 小菜鸡一枚,欢迎一起交流学习~
展开
-
排序——快速排序
时间复杂度为O(NlogN)。#includeint a[101];void quicksort(int *a,int left,int right){ int index,temp; if(left>=right) return ; index=a[left]; //index中存的就是基准数 int i=left; int j=right; while(i!=j)原创 2016-08-04 10:28:22 · 427 阅读 · 0 评论 -
最大k乘积问题
题目描述: 设I是一个n位十进制整数。如果将I分割为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。题目类型:动态规划示例: 5 3 78654 输出:36624题目分析:/*构造出矩阵表,行从1--len,列从1--k 1) m(i,j)=w(1,i);(当j=1时) 2) m(i,j)=max{m(q,j-1)*w原创 2017-01-02 15:52:12 · 1493 阅读 · 0 评论 -
最大子段和
题目描述: 给定n个整数(可能包含负数)组成的序列,求该序列子段和的最大值。题目类型:动态规划 分别使用一层、两层、三层for循环实现。 代码如下:#include<stdio.h>int a[100]={0};void show(int begin,int end,int sum){//输出最大子段以及sum值 for(int i=begin;i<=end;i++) {原创 2017-01-03 13:04:30 · 888 阅读 · 0 评论 -
电路布线问题
题目描述: 做电路板时,将n条连线分布到若干绝缘层上。在同一层的连线不相交。电路布线问题就是要确定将哪些连线安排到第一层上,使该层上有尽可能多的连线。题目类型:递归、动态规划题目分析:1)当i=1时,size(i,j)={0, 当j<p(1) {1, 当j>=p(1)2)当i>1时,size(i,j)={size(i-1,j), 当j<p(i)原创 2017-01-03 15:53:53 · 3520 阅读 · 0 评论 -
数独问题
问题描述: 标准的数独游戏是在一个 9 X 9 的棋盘上填写 1 – 9 这 9 个数字,规则是这样的: 棋盘分成上图所示的 9 个区域(不同颜色做背景标出,每个区域是 3 X 3 的子棋盘),在每个子棋盘中填充 1 – 9 且不允许重复 ,下面简称块重复 每一行不许有重复值,每一列不许有重复值 题目类型:回溯算法代码如下:(严禁抄袭,请尝试自己动手实现。——Ldu1403)/*该题和拉原创 2016-12-25 17:36:49 · 1674 阅读 · 0 评论 -
填数字
题目描述: 填入1~12的数字。使得每条直线上的数字之和都相同。 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 题目类型:回溯算法 解题思路: 现在对于一个关于一定范围内的数字问题 ,尤其是互不相同的,不管是一维,二维,环或者说是无规则的图形,我的第一思考是回溯,比如一维的像数字排列,二维的拉丁矩阵、数独问题,首尾相连的素数环问题。我都是用相同的补充数字方法。(该方法原创 2016-12-22 17:20:47 · 1887 阅读 · 0 评论 -
拉丁矩阵
题目描述: 现有n种不同形状的宝石,每种宝石有足够多颗。欲将这些宝石排列成m行n列的一个矩阵,m<=n,使矩阵中每一行和每一列的宝石都没有相同的形状。试设计一个算法,计算出对于给定的m和n,有多少种不同的宝石排列方案。 题目类型:回溯算法 解题思路: 我把这几个相同处理方式的题目,放在了一起,希望有心者可以结合在一起思考,会更容易理解该类型的回溯题目。解题秘籍 代码如下:(严禁抄袭,请尝试原创 2016-12-25 17:41:45 · 2068 阅读 · 0 评论 -
迷宫问题
题目描述: 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我原创 2016-12-25 17:54:20 · 1054 阅读 · 0 评论 -
数字排列
有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。 要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列: 17126425374635 当然,如果把它倒过来,也是符合要求的。 请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。 注意:只填写这个14原创 2016-12-20 23:15:25 · 1055 阅读 · 0 评论 -
租用游艇问题
长江俱乐部在长江设置了n个游艇出租站1,2,…n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),设计一个算法,计算出从出租站1到出租站n所需要的最少租金。 测试用例: 3(站数) 5 15(第一站到其他相应各站的租金) 7(第二站到其他相应各站的租金) 输出: 12 题目类型:动态规划 题目分析:该题目的原创 2016-12-20 23:24:58 · 3424 阅读 · 0 评论 -
最优合并问题
【问题描述】 给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。 【测试用例】 4(序列数) 5 12 11 2(序列中的元素数) 【输出结果】 78(最差情况) 52(最优情况)代码:/*1.对原创 2018-01-02 10:04:49 · 4212 阅读 · 0 评论 -
石子合并问题
【问题描述】 在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 【测试用例】 4(石子的堆数) 4 4 5 9(每一堆的石子数目) 【输出】 43 54代码:/*m[i][j] = m{m[i][k] + m[原创 2018-01-02 10:13:16 · 1792 阅读 · 0 评论 -
独立任务最优调度
【问题描述】 用两台处理机A和B处理n个作业。设第i个作业交给A处理需要时间ai,交给B处理需要时间bi。由于各作业的特点和机器的性能关系,ai和bi之间没有明确的大小关系。既不有将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这两台机器处理完这n个作业的时间最短。 【测试用例】 6(任务数目) 2 5 7 10 5 2(机器A处理这些任务的时间原创 2018-01-02 10:19:21 · 1976 阅读 · 1 评论 -
最长公共子序列问题
【问题描述】 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。 给定两个序列X和Y,找出二者的最长公共子序列。 方法一(递归)#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 100char a[N],b[N];int p=0,q=0;int fun(int m,int n){//递归原创 2018-01-02 10:27:51 · 2489 阅读 · 0 评论 -
字典序问题
【问题描述】 在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc,xyz等字符串都是升序字符串。现在对字母表中产生的所有长度不超过6的升序字符串,计算它在字典中的编码。 【样例输入】 2 a b 【样例输出】 1 2代码原创 2018-01-02 10:33:52 · 1432 阅读 · 0 评论 -
排列的字典序问题
【问题描述】 n个元素共有n!个不同的排列。将这n!个元素按照字典序排列,可以从0编号,直至n!-1。例如,当n=3时,6个不同排列的字典序值为: 0 1 2 3 4 5 123 132 213 231 312 321 【编程任务】 给定n以及n个元素的一个排列,计算出这个排列的字典序值;给定一个字原创 2018-01-02 10:37:05 · 1826 阅读 · 0 评论 -
矩阵连乘问题
方法一(递归方法)#include<stdio.h>#include<string.h>#define Num 100int p[Num],s[Num][Num];void traceback(int i,int j) { if(i==j) return; traceback(i,s[i][j]); traceback(s[i][j]+1,j原创 2018-01-02 10:39:29 · 1611 阅读 · 0 评论 -
《计算机算法设计与分析》题目汇总
Github源码地址:https://github.com/hlk-1135/Data-Structures-and-Algorithms递归与分治:电路布线问题有重复元素的排列问题集合划分问题半数集和半数单集循环日程赛矩阵连乘问题最长公共子序列问题排列的字典序问题字典序问题动态规划:流水作业调度问题租用游艇问题电路布线问题最大子段和最小m段和最大k乘积问题石子合并原创 2017-01-02 10:11:40 · 10787 阅读 · 1 评论 -
最小m段和
题目描述: 给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小? 题目类型:动态规划题目分析:n个数字,分成m段,使这m段子序列的和的最大值达到最小 状态转移方程:s[i][j]=min{max{s[i][1]-s[k][1],s[k][j-1]}} s[i][j]表示 前i个数字分成j段。 可以这样理解,1原创 2017-01-02 21:13:41 · 1608 阅读 · 1 评论 -
n皇后问题
题目描述: N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。 题目类型:暴力、回溯暴力算法代码:(严禁抄袭,请尝试自己动手实现。——Ldu1403)#include<stdio.h>#include<math.h> #define n 8int main(){ int i,j,num,fla原创 2016-12-22 13:34:27 · 856 阅读 · 0 评论 -
马的Hamilton周游路线
8*8的国际象棋棋盘上的一只马,恰好走过除起点外的其他63个位置各一次,最后回到起点,这条路线称为马的一条Hamilton周游路线。对于给定的m*n的国际象棋棋盘,m和n均为大于5的偶数,且|m-n|≤2,试设计一个分治算法找出马的一条Hamilton周游路线。#include#include#define max 101 int m,n;//棋盘大小int start_x,star原创 2016-10-11 11:41:23 · 3760 阅读 · 0 评论 -
循环日程赛
问题描述: 设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能参赛一次; (3)循环赛在n-1天内结束。 请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i原创 2016-10-13 11:54:52 · 1342 阅读 · 0 评论 -
半数集和半数单集问题
半数集问题描述: 给定一个自然数n,由n 开始可以依次产生半数集set(n)中的数如下。 (1) n∈set(n); (2) 在n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。 注意半数集是多重集。算法设原创 2016-10-17 19:51:01 · 3168 阅读 · 0 评论 -
Prime Ring Problem(素数环问题)
Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, …, n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.Note原创 2016-12-14 09:22:23 · 1025 阅读 · 0 评论 -
删数问题
问题描述: 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n和k,设计一个算法,找出剩下数字组成的新数最少的删数方案。 输入示例: 178543 4 输出: 13 题目类型:贪心算法 解题思路: 每次找出第一个降序点,然后利用后面的数字前移覆盖,将该数字删除。 注:并不是每次删除最大的。 例如178594,先删除8原创 2016-12-21 18:55:04 · 1425 阅读 · 0 评论 -
流水作业调度问题
问题描述: n个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,后在M2上加工。在两台机器上加工的时间分别为ai和bi。 目标:确定这n个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。 题目类型:动态规划 算法描述: 流水作业调度问题的Johnson算法: (1) 令 (2)将N1 中作原创 2016-12-25 20:19:24 · 25919 阅读 · 6 评论 -
批处理作业调度问题
问题描述: 给定n个作业的集合J={J1,J2,…,Jn}。每一个作业有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,再由机器2处理。作业Ji需要机器j的处理时间为tji,i=1,2,…n,j=1,2。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和f=F21+F22+…+F2n称为该作业调度的完成时间和。 批处理作原创 2016-12-27 14:15:31 · 4023 阅读 · 0 评论 -
集合划分问题
1.问题描述: n 个元素的集合{1,2, , n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2 , 3,4}可以划分为15,不同的非空子集如下: {{1},{2} ,{3},{4}}, {{1,2} ,{3},{4}}, {{1,3},{2} ,{4}}, {{1,4} ,{2} ,{3}}, {{2,3},{1},{4}}, 其中,集合{{1,2 ,原创 2016-10-21 09:44:47 · 3852 阅读 · 2 评论 -
有重复元素的排列问题
1.问题描述 设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法,列出R的所有不同排列。 即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。2.算法设计 给定n及待排列的n个元素,计算出这n个元素的所有不同排列。3.数据输入 第1行是元素个数n,1原创 2016-10-28 23:15:24 · 21260 阅读 · 5 评论 -
最小重量机器设计问题
问题描述: 设某一机器由n个部件组成,每一种价格都可以从m个不同的供应商处购得。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。 题目类型:回溯算法 代码如下:/*该题traceback(num)中num代表的是第几个部件 */ #include<stdio.h>int n,m,d; int val原创 2017-01-02 10:25:20 · 4234 阅读 · 0 评论 -
图的m着色问题
题目描述: 给定无向连通图和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边相连接的两个顶点着不同颜色,称这个数m为这个图的色数。求一个图的色数m称为图的m可着色优化问题。 给定一个图以及m种颜色,请计算出涂色方案数。 题目类型:回溯算原创 2017-01-02 11:10:03 · 1080 阅读 · 0 评论 -
符号三角形问题
题目描述: 在符号三角形中,有14个“+“和14个“-”。2个同号下面是+,两个异号下面是-。 在一般情况下,符号三角形的第一行有n个符号。符号三角形问题,要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”相同。 题目类型:暴力算法、回溯算法 0、1暴力算法代码如下:/*二进制将第一行确定,再由a[i][j]=a[i-1][j]^a[i-1][j+1]依次原创 2017-01-02 11:23:49 · 1206 阅读 · 0 评论 -
连续游资问题
题目描述: 假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮箱问题要求对于给定的n和m,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。 例如当n=5,m=4时,面值为1,3,11,15,32的5种邮票可以贴出邮资的最大连续区间是1到70。 题目类型:回溯算法 最多可以贴m张邮票,所以回溯时traceback选择原创 2017-01-02 11:36:57 · 1875 阅读 · 0 评论 -
39级台阶
问题描述: 小明看完电影《第39级台阶》,离开电影院的时候,他数了数视觉的台阶数,恰好是39级。 站在台阶前,他突然又想起一个问题:如果我每一步只能迈上1个或2个台阶,先迈左脚,然后左右交替,最后一步迈右脚,也就是说一共要迈偶数步。那么,上完39级台阶,有多少种不同的上法呢? 请利用计算机的优势,帮助小明寻找答案。 题目类型:回溯算法 代码如下:/*row代表行数,即台原创 2017-01-02 15:03:53 · 1237 阅读 · 0 评论 -
最优分解问题
题目描述: 设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。 输入 10 输出 30 题目类型:贪心算法 题目分析: 该题是将正整数进行分解,而且互不相同,a+b>2,所以分解成的数字越接近越好。整体思路是,将该整数分解成从2开始依次递增的数字,直到不能分解为止,将剩余的数字从后往前往返依次加1。 例如:19 分解为2,3,原创 2017-01-02 15:15:10 · 2936 阅读 · 0 评论 -
会场安排问题
题目描述: 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个算法进行安排。 测试用例: 5(活动数目) 1 23 12 28 25 35 27 80 36 50 输出:3 题目类型:贪心算法题目分析: 一个活动的安排,取决于该活动的开始时间和上一个活动的结束时间是否冲突。所以先按照活动的结束时间将所有活动进行排序。然后循环安排活动,循环一遍原创 2017-01-02 15:23:10 · 3022 阅读 · 1 评论 -
CCF、CSP历年真题(T1合集)
最初刷题,是按照年份,后来改变策略,由易到难,先做完所有年份的第一题,再做所有年份的第二题,以此类推…(所有代码已经校验可以获得100分)试题编号: 201812-1试题名称: 小明上学问题描述: 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校。为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间。他上学需要经过数段道路,相邻两段道路之间设有至多一盏...原创 2019-03-14 23:54:49 · 5718 阅读 · 3 评论