紫书算法学习记
文章平均质量分 64
《算法竞赛入门经典(第2版)》刘汝佳著作
Only you, only you!
这个作者很懒,什么都没留下…
展开
-
快速幂(矩阵快速幂)
一、快速幂求:3^0 + 3^1 +…+ 3^(N) mod 1000000007 Input 输入一个数N(0 Output 输出:计算结果 Sample Input 3 Sample Output 40【分析】 利用等比数列的求和公式得所求和是(3^(n+1)-1)/2,如果暴力求3^(n+1)会超时,这里引入快速幂来加速。 思想类似这样,比如求3^8,直接求的话就原创 2017-08-09 17:17:35 · 386 阅读 · 0 评论 -
(数论)欧拉函数
本文直接使用刘汝佳《算法竞赛入门经典》(第2版)中的讲解部分,此部分讲解的非常清楚明白,不再过多赘述,唯一要写的是对第二个代码的理解。 void phi_table(int n,int *phi){ for(int i=2;i<=n;i++) phi[i]=0; phi[1]=1; for(int i=2;i<=n;i++){ if...原创 2018-03-02 17:29:16 · 326 阅读 · 0 评论 -
(数论)可重复选择的组合、杨辉三角
本文参考刘汝佳《算法竞赛入门经典》(第2版)组合数【题目】有n个不同的数,每个数可以选择多次,共选k个数,有多少种选法?例如有3个数:3,4,5,选2个数,所有选法是(3,3),(3,4),(3,5),(4,4),(4,5),(5,5)共6种选法。【分析】设第i个数选xi个,那么x1+x2+…+xn=k,转化成求解该n元一次方程的非负整数解的个数,又设yi=xi+1,那么y1+y2...原创 2018-03-02 17:23:34 · 1298 阅读 · 0 评论 -
(数论)模运算、同余、逆元
本文参考刘汝佳《算法竞赛入门经典》(第2版)模运算(a+b) mod n = ((a mod n)+(b mod n)) mod n (a-b) mod n = ((a mod n)-(b mod n)) mod n ab mod n=((a mod n)(b mod n)) mod n1)大整数取模(利用高精度乘法)for(int i=0;i<len;i++) ...原创 2018-03-01 21:35:36 · 2018 阅读 · 0 评论 -
(数论)整数二元一次不定方程(扩展欧几里得求解)
问题:形如a*x+b*y=c(a,b均不为0)的方程,a,b,c都是整数,求(x,y)整数解。判断是否有解整数二元一次方程有解的充要条件是gcd(a,b)|c。如果不能整除则无解。扩展欧几里得算法欧几里得算法就是求出a*x+b*y=gcd(a,b)的一个解(特解)代码如下:int ex_gcd(int a,int b,int &x,int &y){...原创 2018-03-01 18:08:11 · 2869 阅读 · 0 评论 -
(数论)Eratosthenes筛法
思想:对于某个数i,把2i,3i,…(i的倍数都不是素数)标记一下,剩下的都是素数。memset(vis,0,sizeof(vis));for(int i=2;i<=n;i++) for(int j=2*i;j<=n;j+=i) vis[j]=1;【例题七夕节 HDU - 1215 】 题目大意:求某个正整数的非自身的所有因子的和。方法一:Eratosthe...原创 2018-03-01 09:24:02 · 837 阅读 · 0 评论 -
(数论)最大公约数、最小公倍数、唯一分解定理
一、最大公约数gcd约数和倍数的定义(百度百科)整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。 显然,任何非0整数是0的约数,0不是任何数的约数。int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}二、最小公倍数lcm定理:lcm(...原创 2018-03-01 09:04:02 · 2111 阅读 · 0 评论 -
(数论)哥德巴赫猜想
关于偶数的哥德巴赫猜想:任一大于2的偶数都可写成两个素数之和。关于奇数的哥德巴赫猜想:任一大于7的奇数都可写成三个质数之和的猜想。【例题1 Dima and Lisa CodeForces - 584D 】 Dima loves representing an odd number as the sum of multiple primes, and Lisa loves it ...原创 2017-08-20 15:53:03 · 962 阅读 · 0 评论 -
中国剩余定理
一、中国剩余定理(互质版)核心代码:int crt(int a[],int m[],int n){ int M=1; int ans=0; for(int i=0;i<n;i++) M*=m[i]; for(int i=0;i<n;i++) { int x,y; int Mi=M/m[i];原创 2017-08-18 17:24:55 · 2185 阅读 · 0 评论 -
数论刷题
Dima and Lisa CodeForces - 584DDima loves representing an odd number as the sum of multiple primes, and Lisa loves it when there are at most three primes. Help them to represent the given number as the原创 2017-08-18 00:20:07 · 409 阅读 · 0 评论 -
数论基础知识
一、最大公约数gcd约数和倍数的定义(百度百科)整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。 显然,任何非0整数是0的约数,0不是任何数的约数。int gcd(int a,int b){ if(b==0)return a; return gcd(b,a%b);}二、最小公倍数lcm定理:lcm(a原创 2017-08-15 12:47:03 · 4054 阅读 · 0 评论 -
dp入门(放苹果 POJ - 1664)
放苹果 POJ - 1664把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sam...原创 2017-12-10 20:56:01 · 348 阅读 · 0 评论 -
紫书第九章-----动态规划初步(背包问题)
问题一:0-1背包问题有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?如下表,利用动态规划思想从左到右,从上到下生成所有状态: 代码实现:#include&amp;lt;cstdio&amp;gt;#include&amp;lt;iostream&amp;gt;#include&amp;l原创 2017-08-07 13:59:10 · 578 阅读 · 0 评论 -
紫书第九章-----动态规划初步(最优三角剖分,例题9-11 Minimax Triangulation UVA - 1331 )
最优三角剖分《算法竞赛入门经典(第2版)》讲解如下: 三角剖分是指用不相交的对角线把一个多边形分成若干个三角形。 例题9-11 Minimax Triangulation UVA - 1331本题就是三角剖分的一个典型例题,求的是最大三角形的面积中,面积最大的三角形的面积最小的三角剖分所对应的这个最大的三角形面积。这道题需要注意的地方是,因为题目给出的图形不一定是凸多边形,...原创 2018-08-08 23:43:28 · 559 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-9 Cutting Sticks UVA - 10003 、例题9-10 Brackets sequence UVA - 1626 )
例题9-9 Cutting Sticks UVA - 10003【分析】 区间DP题目(分治思想)/* 状态:d[i][j]表示从i到j最优解 状态转移:d[i][j]=min(d[i][k],d[k][j]}+a[j]-a[i],d[i][j]),i&lt;k&lt;j*/#include&lt;iostream&gt;using namespace std;...原创 2018-08-29 17:22:27 · 182 阅读 · 0 评论 -
紫书第九章-----动态规划初步(最优矩阵链乘)
最优矩阵链乘 【分析】 结合《算法竞赛入门经典(第2版)》分析,突破点是最后一次乘法!不妨设Ai到Aj矩阵相乘,最后一次乘法的前k个矩阵之积和后面的矩阵之积相乘。row[i],col[i]表示第i个矩阵的行和列。那么,状态:dp[i][j]表示Ai到Aj矩阵相乘的最小计算量状态转移:dp[i][j]=min{dp[i][k]+dp[k+1][j]+row[i]*col[k]*co...原创 2018-08-08 10:20:07 · 254 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-7 Partitioning by Palindromes UVA - 11584 、例题9-8 Color Length UVA - 1625 )
Partitioning by Palindromes UVA - 11584 /* 状态:d[i]表示以1~i且以i结束的字符串的最少回文串数 状态转移:d[i]=min{d[j-1]+1 | j&amp;lt;=i &amp;amp;&amp;amp; s[j~i]是回文串},s[j~i]是回文串,那么更新d[j-1]+1=d[i]*/#include&amp;lt;iostream&amp;g原创 2018-08-06 22:37:09 · 185 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-6 Lighting System Design UVA - 11400 )
Lighting System Design UVA - 11400【题目大意】 有n种功率不同的灯,分别给出每种灯的功率、所需电源费用(所有该功率的灯只需要这一个电源)、每个灯花费钱数和该种灯所需个数。这是一个工程的要求。可以用大功率灯代替小功率灯。求最少花费多少钱。 【分析】有个事实是,如果用小功率的灯换成大功率的灯,那么一定是所有的小功率的灯A换成大功率的灯B,不可能是A的一部...原创 2018-08-03 12:45:29 · 217 阅读 · 0 评论 -
紫书第九章-----动态规划初步(最长公共子序列LCS)
最长公共子序列LCS原创 2018-08-02 17:49:13 · 224 阅读 · 0 评论 -
紫书第九章-----动态规划初步(最长递增子序列LIS)
最长递增子序列给出一个数字序列求其最长的递增子序列例如序列(1,7,3,5,9,4,8)。(1,7)和(3,4,8)是其递增子序列但其最长的递增子序列是(1,3,5,8)。有了前面的动态规划的基础,下面直接用例题来解决此问题。【例题:最长递增子序列 HRBUST - 1835 】- 规划方向1/* 状态:d(i)表示以a[i]开头(笔者采用此规划方向,当然可以与笔者规划方向...原创 2018-08-01 19:49:16 · 227 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-5 Jin Ge Jin Qu hao UVA - 12563)
完全背包问题一个背包总容量为V,现在有N种物品,第i种物品体积为w[i],价值为v[i],每个物品都有无限多件,现在往背包里面装东西,怎么装能使背包的内物品价值最大?【分析】 完全背包问题和之前的硬币问题如出一辙,都是DAG上的动态规划问题,只需要对硬币问题的代码稍微修改,即可解决完全背包问题。状态定义:d(i)表示从i状态到小于i的其他所有状态的最长路(价值最大)状态转移:d(...原创 2018-07-31 23:31:33 · 229 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-4 Unidirectional TSP UVA - 116 )
【AC代码分享】 本题是简单的动态规划问题,但是打印出字典序最小的路径笔者费了一番周折!笔者特别处理了遇到多解时要输出最小字典序的问题。详见代码如下:/*d(i,j)表示从位置(i,j)出发的最短路径d(i,j)=min{d(i-1,j+1),d(i,j+1),d(i+1,j+1)}*/#include<bits/stdc++.h>using namespace st...原创 2018-07-25 20:09:06 · 222 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-3 Tour UVA - 1347)
本文参考刘汝佳《算法竞赛入门经典》(第2版) * 动态规划的核心是状态和状态转移方程* 【递推法】/*【思考题目】(1)注意一点,去必须从左到右,回必须从右到左,那么去路确定了,返程路径随之确定。(2)题目没有给定数据范围状态确定不了,笔者无力解决此问题……【解决题目】参考刘汝佳《算法竞赛入门经典》(第2版)结合对问题的思考,我们知道从左往右走过之后,返程路径随之确定,既然...原创 2018-07-25 16:16:05 · 221 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-2 The Tower of Babylon UVA - 437)
本题类似于嵌套矩形问题,笔者受嵌套矩形问题启发,解决了本道题目。把本题中所有矩形种类求出来(3*n),接下来就是嵌套矩形问题了。/*【思路分析】先把长方体的所有种类存储起来,然后用这些长方体进行dp大指向小则有边,建立图,因为总是严格的大指向小,所以一定是有向无环图(DAG)。注意一个长方体可能是多种长方体,比如(10,20,30),分别以10,20,30为高,则有3种长方体。题目...原创 2018-07-24 13:04:37 · 207 阅读 · 0 评论 -
紫书第九章-----动态规划初步(例题9-1 A Spy in the Metro UVA - 1025 )
A Spy in the Metro UVA - 1025本文参考刘汝佳《算法竞赛入门经典》(第2版) * 动态规划的核心是状态和状态转移方程*/*【理解题意】 注意本题要求的是最短的等待时间!就是在各个车站等待的时间之和的最小值! 建议通过输入输出样例来更好的明白题意!要尽量多在车上待着,减少在车站等 的时间,这样安全乎!并且要保证在T时刻(约会时间)到达终点...原创 2018-07-23 15:58:46 · 214 阅读 · 0 评论 -
紫书第九章-----动态规划初步(DAG上的动态规划之硬币问题)
本文参考刘汝佳《算法竞赛入门经典》(第2版)* 动态规划的核心是状态和状态转移方程**硬币问题 【分析】 类似于矩形嵌套问题,这个题目也属于DAG上的动态规划问题。d(i)表示凑得钱数之和为i所需要的最大或最小硬币数,若当前状态是i,用硬币j后,状态转移到i-Vj,每个状态看成一个点,这些点就形成了一个DAG图。硬币使用数目最大和最少分别对应了DAG图中的最长路和最短路。与嵌套矩...原创 2018-07-22 18:48:12 · 500 阅读 · 0 评论 -
紫书第九章-----动态规划初步(DAG上的动态规划之嵌套矩形问题)
本文参考刘汝佳《算法竞赛入门经典》(第2版)动态规划的核心是状态和状态转移方程嵌套矩形问题【题目描述】 有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a...原创 2018-07-21 18:33:41 · 1039 阅读 · 0 评论 -
紫书第九章-----动态规划初步(数字三角形)
动态规划的核心是状态和状态转移方程数字三角形 OpenJ_Bailian - 2760回溯法原创 2018-07-19 16:54:34 · 239 阅读 · 0 评论 -
紫书第一章-----程序设计入门
交换两个变量方法总结方法一:#include<iostream>using namespace std;int main(){ int a,b; int t; cin>>a>>b; t=a; a=b; b=t; cout<<a<<" "<<b<<endl; return 0;}方法二:#include<iostream>usin原创 2017-08-14 10:40:18 · 438 阅读 · 0 评论 -
紫书第二章-----循环结构程序设计
阶乘之和输入n,计算S=1!+2!+3!+……+n!的末6位(不含前导0)。n<=1e6 样例输入 10 样例输出 37913代码示范:#include<iostream>#include<ctime>#include<cstdio>using namespace std;const int mod=1e6;void solve(int n){ int sum=0;原创 2017-08-29 16:21:39 · 440 阅读 · 0 评论 -
紫书第三章-----数组和字符串
memcpy用法头文件:cstring 用法: memcpy(b,a,sizeof(int)*k); 这是a,b都是整型数组的时候,把a数组中的前k个元素赋值给b memcpy(b,a,sizeof(a)); 把a中所有的元素赋值给b开灯问题(注意不要输出多余的空格)题目:有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉)原创 2017-08-30 17:09:57 · 299 阅读 · 0 评论 -
刷紫书第三章例题(例题3-1,3-2,3-3)
例题3-1 TEX Quotes UVA - 272TEX is a typesetting language developed by Donald Knuth. It takes source text together with a few typesetting instructions and produces, one hopes, a beautiful document. Be原创 2017-08-31 15:08:27 · 679 阅读 · 0 评论 -
刷紫书第三章例题(例题3-4,3-5,3-6)
例题3-4 Master-Mind Hints UVA - 340发顺丰原创 2017-09-01 15:27:28 · 754 阅读 · 0 评论 -
刷紫书第三章习题(习题3-1到习题3-6)
习题3-1 Score UVA - 1585There is an objective test result such as “OOXXOXXOOO”. An ‘O’ means a correct answer of a problem and an ‘X’ means a wrong answer. The score of each problem of this test is c原创 2017-09-02 22:30:39 · 2769 阅读 · 0 评论 -
刷紫书第三章习题(习题3-7到习题3-12)
习题3-7 DNA Consensus String UVA - 1368原创 2017-09-05 22:49:10 · 1070 阅读 · 0 评论 -
紫书第四章-----函数和递归
文章内容主要参考刘汝佳著作《算法竞赛入门经典》(第2版)计算组合数一般思路(计算范围太小,容易溢出):#include<iostream>using namespace std;long long factorial(int n){ long long ans=1; for(int i=1;i<=n;i++) ans*=i; return ans;}int原创 2017-10-01 11:46:04 · 264 阅读 · 0 评论 -
刷紫书第四章例题(例题4-1,4-2,4-3)
例题4-1 Ancient Cipher UVA - 1339Ancient Roman empire had a strong government system with various departments, including a secret service department. Important documents were sent between provinces a原创 2017-10-01 13:29:36 · 445 阅读 · 0 评论 -
刷紫书第四章例题(例题4-4,4-5,4-6)
例题4-4 Message Decoding UVA - 213原创 2017-10-01 18:41:52 · 539 阅读 · 0 评论 -
紫书第五章-----C++与STL入门(1)
getline(istream &in, string &s)类似C语言中的fgets 从输入流读入一行到string s •功能: –从输入流中读入字符,存到string变量 –直到出现以下情况为止: •读入了文件结束标志 •读到一个新行 •达到字符串的最大长度 –如果getline没有读入字符,将返回false,可用于判断文件是否结束stringstream下面程序参考刘汝佳《算原创 2017-10-13 18:39:20 · 402 阅读 · 0 评论 -
紫书第五章-----C++与STL入门(2(容器))
不定长数组vector参考网址(vector讲解) 1.vector的初始化:可以有五种方式,举例说明如下: (1) vector a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。 (2)vectora(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1 (3)vectora(b); //用原创 2017-10-20 21:26:53 · 261 阅读 · 0 评论