
算法
zzxdddd
这个作者很懒,什么都没留下…
展开
-
dp,洛谷p2437 蜜蜂路线
从m到n,都可以转换为从1到n-m+1,f(i) 表示从1到i的走法f(i)=f(i-1)+f(i-2);#include<iostream>#include<cstring>#include<cstdio>using namespace std;struct bign{ int d[3000]; int len; bign(){ memset(d, 0, sizeof(d)); len = 0; } bign operator .原创 2020-07-26 13:03:43 · 285 阅读 · 0 评论 -
dp,洛谷p1028 数的计算
#include<iostream>using namespace std;long long dp[1005] = { 0 };int main(){ int n; cin >> n; dp[0] = 1; dp[1] = 1; dp[2] = 2; //这是找规律看出来的 for (int i = 3; i <= n; i++){ dp[i] = dp[i - 2] + dp[i / 2]; } cout << dp[n];.原创 2020-07-26 12:38:53 · 187 阅读 · 0 评论 -
dp,洛谷p1044,栈
思路:状态: dp(i,j)表示进栈了i个,出栈了j个,显然,i>=jdp(i-1,j) 再进一个栈 就是dp(i,j) ,dp(i,j-1)再出一个栈就是dp(i,j)故dp(i,j)=dp(i-1,j)+dp(i,j-1);边界条件:dp(i,0) 进栈i个,出栈0个,情况只有一种#include<iostream>using namespace std;typedef long long ll;/*状态: dp(i,j)表示进栈了i个,出栈了j个,显然,i&.原创 2020-07-26 12:31:10 · 204 阅读 · 0 评论 -
dp,洛谷p1010
#include<iostream>#include<string>using namespace std;string f(int n){ string str = "", str1; if (n == 0) return "0"; //2的0次方 , if (n == 2) return "2"; //2的2次方 while (n > 0){ //吧n拆解成2的幂次方 int m = 1,k=0; while (m<=n) /.原创 2020-07-26 12:23:38 · 125 阅读 · 0 评论 -
dp,洛谷p1002过河卒
思路:f(i,j)表示从起点,走到(i,j)的走法f(i,j)可以从f(i-1,j),或者f(i,j-1)走来,马能到的位置不能走f(i,j)=f(i-1,j)+f(i,j-1);边界f(0,0)=1; 为了-1,-2越界,吧0,0移到2,2,小于0的都是0#include<iostream>#include<algorithm>#include<cstdio>using namespace std;struct pos{ int x; int.原创 2020-07-26 12:13:10 · 118 阅读 · 0 评论 -
dp,洛谷p1255 数楼梯
思路:f(i)代表走到第i阶 有多少种走法f(i)=f(i-1)+f(i-2) 走到第i阶,可以从i-2阶,走来,也可以从i-1阶走来#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;struct bign{ int d[5010]; int len; bign(){ len = 0; mems.原创 2020-07-26 12:05:57 · 174 阅读 · 0 评论 -
dp,洛谷p1164,小A点菜
思路:f(i,k)表示前i个数字,花完k元的方法的种数f(i,k)=f(i-1,k-a[i])+f(i-1,k) //点第i道菜或者不点第i道菜#include<iostream>#include<cstdio>using namespace std;int dp[110][10000] = {0};int N, M;int a[110];//记忆化递归int f(int i, int k){ //i<0或k<0 if (i < .原创 2020-07-26 11:58:39 · 167 阅读 · 0 评论 -
376.摆动序列,动态规划
摆动序列如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以.原创 2020-07-22 18:28:07 · 148 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置,二分查找
在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]二分查找统一闭区间的写法:.原创 2020-07-22 10:58:13 · 109 阅读 · 0 评论 -
棋盘问题,dfs+回溯
点击题目大致题意:在一个矩阵里面,有个不规则的棋盘,#代表可以放旗子, ·代表不能放棋子要求放k个棋子,在不同行不同列,有多少种放法思路:不同行不同列,可以按照行放,每一行在某一个列选出一个棋子,然后标志这一列已经被用了.vis_col[ ]用来标记chess[ ]表示棋盘 为1的地方表示可以放棋子dfs(int r,int num) // r代表在第r行找一列出来,num代表这是放的第num个棋子当 num 等于k ,结果加1for(寻找没有被访问过的某一列){继续递归寻找下一行的原创 2020-07-17 19:39:39 · 183 阅读 · 0 评论 -
A Knight‘s Journey dfs+回溯
题目大概意思:在一个棋盘中m*n,马从任意位置出发,马是走日的,输入有多组m,n,要求判断是否马可以吧棋盘上每个位置都走到,可以的话打印路径,要求字典序最小,不能就打印impossible.思路:深搜+回溯马是走日的,一共八种组合,要求路径是字典序最小,横坐标是ABCD…纵坐标是12345… 字典序最序最小就得优先y,y从小到大, x就与y对应,也是小的在前int dx[8] = {-1,1,-2,2,-2,2,-1,1};int dy[8] = { -2, -2, -1, -1, 1, 1,原创 2020-07-17 18:00:20 · 122 阅读 · 0 评论 -
动态规划,Zipper
2192:Zipper描述Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.For example, con原创 2020-07-12 21:05:55 · 141 阅读 · 0 评论 -
动态规划,最佳加法表达式
思路和解析#include <iostream>#include <string>#include <cstring>#include<algorithm>using namespace std;struct bign{ int num[1000]; int len; bign() { memset(num, 0, sizeof(num)); len = 1; } bign(const char *c,int L) {原创 2020-07-12 20:56:37 · 201 阅读 · 0 评论 -
动态规划,最长公共子序列
1808:公共子序列描述我们称序列Z = < z1, z2, …, zk >是序列X = < x1, x2, …, xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, …, ik >,使得对j = 1, 2, … ,k, 有xij = zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序原创 2020-07-12 10:07:26 · 180 阅读 · 0 评论 -
动态规划,最大上升子序列
1759:最长上升子序列描述一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3,原创 2020-07-11 22:01:06 · 247 阅读 · 0 评论 -
动态规划,数字三角形
思路:dp.1.确定子问题,大问题是从顶点,到底层,走过的路径和最大的子问题,从顶点,往下,往左走,两种走法,归结到从这两个位置到底层的最大路径和,取大的,然后加上这个点的路径2.确定状态, i,j f(i,j) 是第i行第j列的数到底层的最大路径和3.确定边界状态,边界是到了底层,最大路径就是自己4.确定状态方程f(i,j)=max(f(i+1,j),f(i+1,j+1))+D[i][j] i<Nf(i,j) = D[i][j]原创 2020-07-11 21:49:32 · 138 阅读 · 0 评论 -
分治,排列的逆序数
思路:根据归并算法改编,分治总体大概是,分成两半,左边的逆序数+右边的逆序数+左边的一个数和右边一个数组成的逆序对的数量关键在于如何求左边的一个数,和右边一个数组成的逆序对的数量可以吧左右两边排序从大到小,然后两个指针,i和j开始分别指向左边第一个和右边第一个.然后遍历,如果a[i]>a[j] a[i] 就大于a[j]和之后所有的元素 cnt+= (j之后所有数的个数) 如果 a[i<=a[j]就不是逆序对,j++,继续寻找左右两边排序,正好可以用归并排序,归并前,先算出跨越左右的逆原创 2020-07-11 15:14:51 · 162 阅读 · 0 评论 -
分治,输出前m大的数
思路:分治的思想,先按照某个值,例如第一个数,开始划分,比a[0]小的放在左边,a[0]大的分在右边,然后根据a[0]的位置,判断a[0]右边包括a[0]一共有多少个数和k比较大小,如果等于k,已经分好了,如果小于k,还需要加a[0]的左边,继续划分出k-(右边的个数),如果大于,说明多了,继续划分k个,从 a[0]的下一个位置开始#include<cstdio>#include<algorithm>using namespace std;void swap(int *a原创 2020-07-11 14:59:46 · 126 阅读 · 0 评论 -
二分,河中跳房子
10:河中跳房子描述每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L)。在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一个岩石跳到另一个岩石。当然,实力不济的奶牛是没有办法完成目标的。农夫原创 2020-07-09 15:51:03 · 209 阅读 · 0 评论 -
二分,月度开销
009:月度开销总时间限制: 1000ms 内存限制: 65536kB描述农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。约翰的目标是合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。输入第原创 2020-07-09 11:06:38 · 194 阅读 · 0 评论 -
分解因数
1751:分解因数标签:递归描述给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * … * an,并且1 < a1 <= a2 <= a3 <= … <= an,问这样的分解的种数有多少。注意到a = a也是一种分解。输入第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 < a < 32768)输出n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数样例输入原创 2020-07-07 16:39:04 · 414 阅读 · 0 评论 -
简单的整数划分
本题思路和代码原创 2020-07-06 15:06:11 · 238 阅读 · 0 评论 -
6种排序算法
选择排序: public static void sort(Comparable[] a){ int N=a.length; for(int i=0;i<N;i++){ //min保存最小的元素的下标 int min=i; for(int j=i+1;j<N;j++) //遇到更小的,更新下标 if(less(a[j],a[min]))原创 2020-06-19 19:15:53 · 180 阅读 · 0 评论 -
给二叉树的后序和中序,求出前序
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。输入格式:第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。输出格式:在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。输入样例:72 3 1 5 7 6 41 2 3 4 5 6 7输出样例:Preorder: 4 1 3 2 6 5 7...原创 2020-05-13 22:52:19 · 1031 阅读 · 0 评论 -
KMP算法
1.主要是match数组用来撤回到上一次的相同的部分2.KMP函数里面1.如果相同就两个字符串指针都继续往前走2.如果不同,撤回pattern那个字符串的p指针撤回到上一个相同的部分的下一个位置 p=match[p-1]+1,除非p是0的位置就,string字符串的指针s走一步在这里插入代码片...原创 2020-05-07 22:15:28 · 106 阅读 · 0 评论