![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
挑战程序设计竞赛
三元湖有大锦鲤
我吃吃吃。
展开
-
挑战程序设计竞赛 第二章 初级篇 2.3 记录结果再利用的“动态规划”
动态规划:DP(Dynamic Programming)。最经典的DP问题:01背包问题:题意:有n个重量和价值分别为wi, vi的物品。从这些物品中挑选出总质量不超过W的物品,求所有挑选方案中价值总和的最大值。输入:n = 4(w, v) = {(2, 3), (1, 2), (3, 4), (2, 2)}W = 5输出:7(选择第0、1、3号物品)这个经典问题,我们先使用最朴素的搜索试一下:int n, W;int w[MAX_N], v[MAX_N];int rec(int原创 2022-04-29 12:05:42 · 93 阅读 · 0 评论 -
挑战程序设计竞赛 第二章 初级篇 2.6 数学问题的解题窍门数论 辗转相除法 最大公约数 扩展欧几里得算法 素性测试 埃氏筛 快速幂 求模运算 约数枚举 整数分解
原创 2022-02-26 11:13:33 · 179 阅读 · 0 评论 -
动态规划 DP 01背包 搜索 记忆化搜索 优化 最长公共子序列问题
动态规划:DP(Dynamic Programming)。最经典的DP问题:01背包问题:题意:有n个重量和价值分别为wi, vi的物品。从这些物品中挑选出总质量不超过W的物品,求所有挑选方案中价值总和的最大值。输入:n = 4(w, v) = {(2, 3), (1, 2), (3, 4), (2, 2)}W = 5输出:7(选择第0、1、3号物品)这个经典问题,我们先使用最朴素的搜索试一下:int n, W;int w[MAX_N], v[MAX_N];int rec(int原创 2022-02-21 15:28:48 · 311 阅读 · 0 评论 -
挑战程序设计竞赛 第二章 初级篇 2.2 一直往前 贪心法 硬币问题 区间问题 最小字典序问题 POJ 3253 Fence Repair POJ 3069 Saruman‘s Army
贪心法:遵循某种规则,不断贪心地选取当前最优策略的算法设计方法。硬币问题这一类问题可能是贪心算法问题中最简单的问题了,硬币问题也可以使用暴力枚举的方法求解。如果使用贪心算法,过程将会很高效且简单。其遵循的规则是:优先使用最大面值的硬币。const int V[6] = {1, 5, 10, 50, 100, 500};int C[6];int A;void solve(){ int ans = 0; for(int i=5;i>=0;i--) { int t = min原创 2022-02-21 10:31:21 · 354 阅读 · 0 评论 -
挑战程序设计竞赛 第二章 初级篇 2.1 最基础的“穷竭搜索”
穷竭搜索:深搜广搜,把所有结果找出,寻找答案。1、穷竭搜索 递归函数 递推式 阶乘 斐波那契数列 记忆化搜索 动态规划 空间换时间2、栈 c++ stack 栈的基本操作 push pop empty top size3、队列 c++ queue 队列的基本操作 empty size front back push pop4、深度优先搜索 DFS Depth-First Search 若干数和为k POJ2386 Lake Counting5、广度优先搜索 宽度优先搜索 迷宫问题 最短路径 最少操原创 2022-02-07 10:50:26 · 696 阅读 · 0 评论 -
剪枝 穷竭搜索
上面提到了,穷竭搜索例如递归,深度优先搜索,广度优先搜索,枚举,都是把会出现的所有的解都找一遍,当解空间非常大时,复杂度当然也会非常大。深度优先搜索时,如何已经很明确从当前状态无论如何转移都不会存在解,这种情况下,不继续转移而直接跳过,这种方法叫做剪枝。...原创 2022-02-07 10:45:00 · 790 阅读 · 0 评论 -
特殊状态的枚举 next_permutation函数 C++ n种排列 深搜 回溯
C++标准库中提供了next_permutation函数,可以把n个元素共n!种不同的排列生成出来。例如枚举n个元素的不同排列:bool used[MAX_N];int perm[MAX_N];void permutation1(int pos, int n){ if(pos == n) { //对perm的操作 return; } for(int i=0;i<n;i++) { if(!used[i]) { perm[pos] = i; used[p原创 2022-02-07 09:38:06 · 584 阅读 · 0 评论 -
广度优先搜索 宽度优先搜索 迷宫问题 最短路径 最少操作 由近及远 队列
广度优先搜索,也叫宽度优先搜索,从开始状态,到第一次能到达的状态,再从第一次能到达的状态到下一个能到达的状态,直到探索所有可到达的状态,其时间复杂度为O(状态数×转移的方式)。广度优先搜索使用了队列的数据结构,搜索时先将初始状态加入队列,,此后从队列前端不断取出状态,把从该状态可以转移到的状态中尚未访问过的部分加入队列,直到队列被抽空或找到了问题的解。由于广度优先搜索由近到远的顺序特点,它可以用来求最短路径,最少操作等问题的答案。广度优先搜索中,为做到由近及远的搜索,需要将已经访问过的标记管理起来。状原创 2022-02-06 18:41:35 · 895 阅读 · 0 评论 -
深度优先搜索 DFS Depth-First Search 若干数和为k POJ2386 Lake Counting
深度优先搜索(DFS,Depth-First Search):从一个状态开始,不断转移新的状态,直到无法转移,然后退回上个状态,继续转移。例如,数独,填入一个字之后继续填下一个字,如果无解,返回前一个情况,换一个数字继续填入,反复,最终求解。例如:给定整数a1,a2,…,an,判断是否可以选出若干数,使它们的和为k。int a[MAX_N];int n, k;bool dfs(int i, int sum){ if(i == n) return sum == k; if(dfs(i +原创 2022-02-06 15:45:50 · 167 阅读 · 0 评论 -
队列 c++ queue 队列的基本操作 empty size front back push pop
队列(queue):先进先出的一种数据结构(First In First Out)。que.empty():队列空返回1,否则返回0。que.size():返回队列的数据个数。que.front():访问队头元素。que.back():访问队尾元素。que.push():入队列。que.pop():出队列。#include<queue>#include<cstdio>using namespace std;int main(){ queue<int&原创 2022-02-05 12:23:47 · 1605 阅读 · 0 评论 -
栈 c++ stack 栈的基本操作 push pop empty top size
栈(stack):后进先出(Last In First Out)的一种数据结构。stack::push:在栈顶放入一组数据。stack::pop:在栈顶取出一组数据。stack::top:访问最顶端数据。上一篇讲述的递归函数,其调用就是通过栈来实现的。#include<stack>#include<cstdio>using namespace std;int main(){ stack<int> s; printf("empty:%d\n",s.原创 2022-02-05 11:35:33 · 1162 阅读 · 0 评论 -
穷竭搜索 递归函数 递推式 阶乘 斐波那契数列 记忆化搜索 动态规划 空间换时间
递归函数:调用自身的函数。计算阶乘,它的递推式为:n!=n*(n-1)!所以其递归函数为:int fact(int n){ if(n == 0) return 1; return n * fact(n - 1);}在递归函数中,必须有个停止的条件,例如n==0。如果没有停止条件,递归函数就停不下来了,程序当然也就崩溃了。再来一个斐波那契数列的递归函数,由于其递推式为:a[n]=a[n-1]-a[n-2]。所以:int fib(int n){ if(n <= 1) retur原创 2022-02-05 10:37:46 · 398 阅读 · 0 评论 -
挑战程序设计竞赛 第一章 蓄势待发 准备篇 程序设计竞赛 解题竞赛 Online Judge OJ提交结果 复杂度1秒 POJ 1852 Ants
程序设计竞赛:以程序设计为主题举办的竞赛。分类:解题竞赛,性能竞赛,创意竞赛。能力:设计高效且正确的算法,正确的实现。设计算法:灵活的想象力,算法的基础知识。解题竞赛:Google Code Jam (GCJ),TopCoder,ACM-ICPC,JOI-IOI.Online Judge(OJ):PKU Online Judge(POJ),会津大学Online Judge(AOJ),Sphere Online Judge (SPOJ),SGU Online Contester,U原创 2022-01-19 10:32:42 · 228 阅读 · 0 评论