----算法
lkj41110
这个人很懒,没有写下什么
展开
-
康托展开和康托逆展开
康托展开X=a[n](n-1)!+a[n-1](n-2)!+…+a[i]*(i-1)!+…+a[1]*0! 其中,a[i]为整数,并且X=a[n](n-1)!+a[n-1](n-2)!+…+a[i]*(i-1)!+…+a[1]*0!。这就是康托展开。举个例子1324是{1,2,3,4}排列数中第几个大的数:第一位是1小于1的数没有,是0个,0*3!,第二位是3小于3的数有1和2,但1已经在第一位原创 2015-07-09 18:36:38 · 492 阅读 · 0 评论 -
Hdu 2059 龟兔赛跑
http://acm.hdu.edu.cn/showproblem.php?pid=2059 只要求出乌龟跑到终点的地方最短时间和兔子的时间,相比较。用动态规划求乌龟的时间,把起点和终点也看作一个站点,用dp[i]来保存到这个站点的最短时间,dp[N+1]的时间就是乌龟的时间。比较是否停的关键是两个站点的路程:double temp = T / ((double)1 / VT2 - (double原创 2016-01-30 19:15:41 · 341 阅读 · 0 评论 -
八数码之A*解决方法
学习过A*算法后,通过计算出每个节点的f值,在把队列里的节点通过对f的大小进行排列。 f=h+g g是已经走过的步数,h为还需要最少的步数。#include<iostream>using namespace std;const int MAXX = 1000000;struct Node{ char tile[10]; int pos; int parents;原创 2016-03-02 10:23:31 · 384 阅读 · 0 评论 -
HDU 1158(简单的动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1158 求员工的工资,雇佣,解雇,工作都要使用相应的钱。 用一个二维的数组利用动态规划来解决问题。dp[i][j]表示第i个月j个员工所需要的最少工资。每个月的员工人数大于最少的人数,小于等于所有的最大人数。 状态转换公式: dp[i][j]=min( dp[i-1][x] +额外的钱 )+j*工作工资 (原创 2016-02-14 19:59:27 · 428 阅读 · 0 评论 -
hdu 2191(多重背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2191一种转换成普通的01背包,遍历物品的个数。 另一种就是把物品个数用2^k表示,是上一种01背包的优化。代码:#include<iostream>using namespace std;int dp[105];int p[105], h[105], c[105];int m,t,n;void O1f原创 2016-02-18 21:49:12 · 474 阅读 · 0 评论 -
hdu 1258和ZJU 1711 Sum It Up(dfs经典索搜)
http://acm.hdu.edu.cn/showproblem.php?pid=1258 我的第一道索搜题,想了半天还是没有办法去除重复的情况,看了别人的结题报告才知道这么简单,就是用一个变量保存上一次的节点就行。#include <cstdio>#include <string>int a[12], n, m, f, c, d[12],l;void dfs(int, int);voi原创 2016-02-20 14:51:06 · 613 阅读 · 0 评论 -
hdu 1238 Substrings (最长相同连续子序列)
http://acm.hdu.edu.cn/showproblem.php?pid=1238求几个序列的最长相同子序列,这道题本来一直在想怎么用dfs方法解决,后来看了大牛的结题思路,才明白字符串的长度才100,穷举也可以过。 只要先找到最短的子序列,遍历出一个子序列,把它的顺逆序列分别保存到s1和s2中,再用strstr()函数就可以了。 代码:#include<iostream>using原创 2016-02-25 15:14:24 · 588 阅读 · 0 评论 -
算法竞赛入门经典读书笔记——二叉树
数组的方式很简单,就是从根节点开始1,2,3依次标号,左节点是 父节点*2,右节点是 父节点*2+1。这种方法的缺点就是需要大量的空间保存数组(包括很多空节点)。例如树共有n层,则需要长度为2^n-1的数组。还有一种方式就是利用链表的方式,具体实现方法在代码注释里都很清楚。#include<iostream>#include<string.h>using namespace std;const原创 2016-02-25 20:50:24 · 426 阅读 · 0 评论 -
hdu 1239 Calling Extraterrestrial Intelligence Again
http://acm.hdu.edu.cn/showproblem.php?pid=1239 一道水题,只要遍历找出所有的素数,应为a,b都不大,所以直接穷举法就可以过了。#include<iostream>using namespace std;int m, a, b,l;int p[999],_p,_q;int isP(int n){ for (int i = 2; i*i <原创 2016-02-26 14:11:53 · 272 阅读 · 0 评论 -
hdu1237简单计算器(栈的简单运用)
题目非常简单,也是栈的经典应用。这道题是没有括号的,还有一种四则运算是有括号的。 我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2”叫做中缀表达式。因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化。中缀表达式“9+(3-1)3+10/2”转化为后缀表达式“9 3 1-3+ 10 2/+”后缀表达式方便计算机计算,所以我们要把中缀表达式转换成后缀表达式。我可原创 2016-03-22 23:27:13 · 339 阅读 · 0 评论 -
hdu1102Constructing(最小生成树详解)
一道最典型的最小生成树树树是一种特殊的图,图的生成树是图的一种特殊子图。 如果一个无向连通图中不存在回路,则这种图称为树。 生成树生成树:连通图G的一个子图如果是一棵包含G的所有顶点的 树,则该子图称为G的生成树。 用不同的遍历图的方法,可以得到不同的生成树;从不同的 顶点出发,也可能得到不同的生成树。 生成树是连通图的最小连通子图。所谓最小是指:若在树中 任意增加一条边,则将出现一个原创 2016-05-26 20:52:44 · 324 阅读 · 0 评论 -
hdu1556Color the ball(线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 第一次接触线段树,题目很简单,如果按照一般思路时间复杂度是O(N),线段树的时间复杂度是O(logN)。只是空间复杂度要O(2N),应此要优化空间。线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 对于线段树中的每一个非叶子节点[a原创 2016-05-22 21:31:25 · 314 阅读 · 0 评论 -
hdu 2037(最简单的贪心算法)
http://acm.hdu.edu.cn/showproblem.php?pid=2037 把队列按照,结束时间从小大到排列。然后依次遍历,如果开始时间大于前面最后的结束时间就是可行方案,并记录结束时间。 代码:#include<iostream>using namespace std;struct tv{ int s; int e;}a[105];int cmp(c原创 2016-02-11 13:52:02 · 2162 阅读 · 0 评论 -
HDU1052 Tian Ji (经典贪心算法)
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1052 田忌赛马问题,可以用贪心算法解决。 先把两个的队列从大到小排列。 原先错误的思路: 1、田忌的快马比齐王的快,直接比掉。 2、若快马没有快,就拿田忌最慢的和齐王最快的比较。正确的思路: 1、田忌的快马比齐王的快,直接比掉。 2、若快马没有快,拿田忌最慢的和齐王最慢的比较,若快直接比掉原创 2016-02-10 20:13:20 · 525 阅读 · 0 评论 -
hdu 1050 Moving Tables
http://acm.hdu.edu.cn/showproblem.php?pid=1050简单的题目,就是求交叉的路线最多次数。 注意:房间可能从大到小,也可能从小到大。1和2属于同一个,2和3也是。。。。等等#include<iostream>using namespace std;int n,m,a[405];int main(){ int temp1, temp2;原创 2016-02-08 20:43:53 · 213 阅读 · 0 评论 -
经典迷宫问题
经典的迷宫问题,分别用了BFS与DFS解决。#include<iostream>#include<queue> using namespace std;/*6 80 0 1 1 0 1 1 11 0 1 0 1 0 1 00 0 0 0 0 1 1 10 1 1 1 0 0 1 11 0 0 1 1 0 0 00 1 1 0 0 1 1 0*/struct point{原创 2015-07-26 19:24:57 · 704 阅读 · 0 评论 -
大数——10000以内的阶乘
刚开始看到这个题目的时候,无从下手,后来查了大数运算的原理,是使用数组来模仿大数的运算,可以做到大数的加,减,乘运算。#define N 9999 int a[N * 5] = { 1 };int main(){ int num = N; int len = 1,temp=0,i; for (; num;num--){ for (i = 0; i < len; i+原创 2015-07-21 13:36:57 · 529 阅读 · 0 评论 -
求最大子串
#include<iostream>using namespace std;#define N 5struct number{ int start, end, date;};int *arr,max;number *dp;void input(){ arr = new int[N]; dp = new number[N]; for (int i = 0;原创 2015-08-06 16:21:37 · 451 阅读 · 0 评论 -
hdu 1029
虽然题目很简单,但还是看了别人的题解才做出来#include<iostream>using namespace std;int n,x;int main(){ while (cin>>n) { int time = 0, res; for (int i = 0; i < n; i++){ cin >> x;原创 2016-01-21 16:12:44 · 271 阅读 · 0 评论 -
A*算法解八数码问题
1 问题描述1.1什么是八数码问题八数码游戏包括一个33的棋盘,棋盘上摆放着8个数字的棋子,留下一个空位。与空位相邻的棋子可以滑动到空位中。游戏的目的是要达到一个特定的目标状态。标注的形式化如下: 12345678转载 2016-01-24 15:09:22 · 1976 阅读 · 0 评论 -
算法学习题目
1. POJ 推荐50题1.1 第一类 动态规划(至少6题,2479 和 2593 必做)2479 和 259310151042(可贪心) 114110501080122112602411(稍难) 12761.2 第二类 搜索(至少4题)1011103311292049205624882492(稍难,转载 2016-01-24 15:36:52 · 3808 阅读 · 0 评论 -
hdu 1465不容易系列之一
http://acm.hdu.edu.cn/showproblem.php?pid=1465 这是一道排错问题,用排错公式。 排错公式推导:当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. 第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法; 第二步,放编号原创 2016-01-24 18:25:26 · 279 阅读 · 0 评论 -
hud 1467(动态规划。解题报告)
题目的地址 http://acm.hdu.edu.cn/showproblem.php?pid=1467在给出的三角型中,找出最大的白色三角形。三角形最大个数可用层数表示。 分别对向上,和向下的三角形进行遍历。如果向下的三角形a[i][j]为白,判断a[i-1][j]是否为白,再把两边三角形较小的个数+1,即可。#include<stdio.h>#include<string.h>#incl原创 2016-01-25 18:05:14 · 248 阅读 · 0 评论 -
hdu1176免费馅饼
http://acm.hdu.edu.cn/showproblem.php?pid=1176 可以理解为一个矩阵,把时间和坐标看成i和j,求从底层到顶层的的坐标。 我自己本来的想法是从dp[0][5]出发到顶层看最大的值为多少,看了网上的后,觉得逆向求更好,最后只要看dp[0][5]的值就可以了。状态转移:dp[i][j] += Max(dp[i][j+1], dp[i+1][j+1], dp[原创 2016-01-27 17:46:02 · 287 阅读 · 0 评论 -
HDU1096(最大递增子序列的变形)
http://acm.hdu.edu.cn/showproblem.php?pid=1069输入几种方块,当方块的长宽小于下面那个时可以放在上面,求最大方块的高度。(方块可以无限) 每个方块有6种不同的状态,比如(10,20,30),(10,30,20)等等。30个方块的话,最多有180种形态。 思路:把所有的方块按照x从大到小排列,状态转化方程类似最大递增子序列。if (dp[i].z + t原创 2016-01-28 14:59:23 · 473 阅读 · 0 评论 -
hdu 1081 To The Max(矩阵中最大的和)
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1081题目是求矩阵中存在的最大子矩阵的和。刚开始吧题目理解错了,以为一定包括矩阵的四个角,错了后才发现里面的也可以。后来看了别人的结题报告 - -。这道题就是求连续子序列的,只要把一维度变成二维度就行了。 一维度:for (int i = 1; i <= n; i++){ max =原创 2016-02-08 18:46:31 · 543 阅读 · 0 评论 -
欧几里德求最大公约数
欧几里德求最大公约数也是就辗转相除法,是最基础最简单的算法之一 求最大公约数int gcd1(int a, int b){ if (a < b){ swap(a, b); } return b == 0 ? a : gcd1(b,a%b);}int gcd2(int a, int b){ if (a < b){ swap(a,原创 2015-07-09 12:49:52 · 468 阅读 · 0 评论