
算法设计与分析
大二下学期的算法学习过程,课程笔记为算法设计与分析这门专业课,同时包括备战蓝桥杯。
学习不易
直到有一天,可以和你并肩站立
展开
-
2n皇后问题(注解)
问题描述给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。输入格式输入的第一行为一个整数n,表示棋盘的大小。接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表...原创 2020-05-06 19:07:42 · 1535 阅读 · 0 评论 -
八皇后问题C++递归回溯法(注解)
代码实现#include<iostream>#include<cmath>using namespace std;int x[21];int n = 8;int num = 0;void Print(){ for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { ...原创 2020-04-17 21:40:51 · 1082 阅读 · 0 评论 -
ZOJ1161-Gone Fishing(枚举+贪心)最全注解
理解题意约翰去钓鱼,他一共有h个小时,有n个湖可以钓。n个湖分布在一条路线上,不能走回头路,并且两两个湖之间都有路程,需要时间走。每个湖可以钓到f[i]条鱼,但是钓过一次后,能够钓到鱼数量减少d[i],d[i]<=0则此湖再也钓不到鱼了。现在问约翰最多可以钓到多少条鱼,并且在每个湖停留的时间。解题思路第一步转换,由于有分钟、小时,且5分钟钓一次鱼的信息,那么首先把所有的时间转换成钓鱼...原创 2020-04-11 02:02:12 · 1335 阅读 · 0 评论 -
课程笔记Wooden Sticks(贪心算法+动态规划)
解题思路由于题目的要求是最少的准备时间,加工越来越长且越来越重的不需要等待时间,所以把木板按照长度进行排序,若长度相同按照重量排序,可以得到一个长度升序的木板数组。bool cmp(stick& a, stick& b)排序后对数据进行分组处理,由于已经保证木板是按照长度升序排列的,接下来只要保证木板的重量是升序则不需要1分钟的准备时间,反之,总时长增加1 。那么就可以转换为...原创 2020-04-10 20:30:02 · 779 阅读 · 0 评论 -
课程笔记01背包(动态规划)
解题思路首先将本问题转化成一个填表问题,利用公式填写,dp[i][j]数组的含义是,从i i+1 i+2 ……n 这些物品当中,容量为j时的背包装物品最大的价值。首先确定边界,dp[n][1~W],表示处理的第n个物品背包的最大价值。当第n个物品重量w[n]大于背包总容量的时候,背包一定装不下这个物品,背包价值为0 。同理,如果第n个物品重量w[n]小于背包总重量的时候,背包一定要装下这...原创 2020-04-06 22:12:39 · 175 阅读 · 0 评论 -
课程笔记最大子段和(分治策略、动态规划)
分治策略https://blog.youkuaiyun.com/qq_43656233/article/details/105086964动态规划数组b[i]表示从任意位置开始,到i位置的最大子段和b[i] = max(b[i - 1] + a[i], a[i])即为动态规划方程#include<iostream>#include<algorithm>using na...原创 2020-04-06 19:53:29 · 176 阅读 · 0 评论 -
课程笔记计算最长公共子序列(动态规划、递归,备忘录优化)
动态规划#include<iostream>using namespace std;const int NUM = 51;int dp[NUM][NUM];int b[NUM][NUM]; // 记录位置void LCSLength(int m, int n, char x[], char y[]){ for (int i = 1; i <= m; ++i) {...原创 2020-03-31 14:57:10 · 1385 阅读 · 0 评论 -
课程笔记矩阵连乘问题(动态规划、递归、备忘录优化)
动态规划这道题感觉和Dijkstra算法有点类似,都是循环先确定一个值后,再去找有没有更优的解法去替换,不过这个题用来学动态规划真的很好理解,要是当时能用这个题这个理解方法也许就继续ACM了…此图即为dp数组的填充过程,首先完成左上到右下的斜对角线的赋0工作,因为矩阵自己乘没有运算,dp[i][i]全部为0 。整体的填充过程为按照对角线依次向右上方,r=2->n,最后一个对角线n只...原创 2020-03-30 17:03:54 · 587 阅读 · 0 评论 -
课程笔记分治策略
分治策略分治策略是对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。其实分治策略是一种不同的递归,递归算法是整体递归,分治策略是分开递归。基本步骤分治法在每一层递归上都有三个步骤:分解:将原问题分解为若干个规模较小,相互独立,与...原创 2020-03-25 22:17:12 · 245 阅读 · 0 评论 -
Fibonacci数列取余10007
#include<iostream>using namespace std;int main(){ int i = 1, j = 1, n; cin >> n; if (n == 1 || n == 2) { cout << "1"; return 0; } int sum = 0; for (int t = 3; t <= n...原创 2020-03-24 11:22:24 · 1291 阅读 · 0 评论 -
小数第n位
资源限制时间限制:1.0s 内存限制:256.0MB问题描述我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。输入格式一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<10...原创 2020-03-22 19:45:14 · 174 阅读 · 0 评论 -
分考场
资源限制时间限制:1.0s 内存限制:256.0MB问题描述n个人参加某项特殊考试。为了公平,要求任何两个认识的人不能分在同一个考场。求是少需要分几个考场才能满足条件。输入格式第一行,一个整数n(1<n<100),表示参加考试的人数。第二行,一个整数m,表示接下来有m行数据以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表...原创 2020-03-22 11:54:49 · 300 阅读 · 0 评论 -
课程笔记递归算法
递归算法递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)递归算法特点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用...原创 2020-03-20 13:38:40 · 419 阅读 · 0 评论 -
课程笔记递推算法
什么是递推所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定。从已知条件出发逐步推到问题结果,此种方法叫顺推。从问题出发逐步推到已知条件,此种方法叫逆推。无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特...原创 2020-03-19 21:30:21 · 684 阅读 · 0 评论 -
合根植物
资源限制时间限制:2.0s 内存限制:256.0MB问题描述星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?输入格式第一行,两个整数m,n,用空格分开...原创 2020-03-19 21:17:38 · 163 阅读 · 0 评论 -
C++并查集模板
查询x的所属集合int find(int x){ if (father[x] == x) return x; father[x] = find(father[x]); return father[x];}i 与 j 两个集合合并void relate(int i, int j){ i = find(i); j = find(j); if (i != j) fath...原创 2020-03-19 21:13:01 · 129 阅读 · 0 评论 -
小计算器
资源限制时间限制:1.0s 内存限制:256.0MB问题描述模拟程序型计算器,依次输入指令,可能包含的指令有1. 数字:‘NUM X’,X为一个只包含大写字母和数字的字符串,表示一个当前进制的数 2. 运算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分别表示加减乘,除法取商,除法取余 3. 进制转换指令:‘CHANGE K’,将当前进制转换为K进制(2≤...原创 2020-03-19 19:43:17 · 255 阅读 · 0 评论 -
C++十进制与任意进制之间的相互转换(2-36进制)
十进制转换为任意进制其实就相当于把10进制转换2进制的方法套用一下,如果小于10的话直接显示,如果大于10做字符上的处理。string change_r(long long n, int r) { if (n == 0) { return "0"; } string ans; while (n) { if (...原创 2020-03-19 19:27:51 · 2085 阅读 · 0 评论