算法
llljw
这个作者很懒,什么都没留下…
展开
-
LeedCode53 最大子序和
求最大子序列的和题目链接:leetcode53 最大子序和本文主要讲述两种方法:贪心算法和分治法一、贪心算法样例数据:int[] a = new int[]{-2,1,-3,4,-1,2,1,-5,4};简单考虑,先假设最大子序列的和肯定大于等于0。从左往右遍历数组对于第一个数,a[0] = -2 < 0;假设最大子序列包含a[0],最大子序列的最右边坐标为j,那么最大子序列...原创 2019-12-27 17:55:51 · 281 阅读 · 3 评论 -
上海金马五校程序设计竞赛 Problem B : Sailing
题目链接 http://acm.dhu.edu.cn/contest/view.html?id=875&index=1优先队列,步数相同的,*号优先#include#include#include#include #include#include #include using namespace std;typedef long long ll;const int原创 2017-06-06 17:44:24 · 346 阅读 · 0 评论 -
最小的最大
二分答案与高中学习的二分法相类似。对于在区间内单调递增的函数,通过判读f(x)是否满足条件,逐步缩小我们的求解范围。 二分答案的框架大致是while(l+1<r){ int mid = (l+r+1)/2; if(judge(mid)){ r = mid; }else{ l = mid; }}此类问题需要注意的是二分的边界问原创 2017-05-16 17:05:58 · 286 阅读 · 0 评论 -
约瑟夫问题
http://www.cnblogs.com/void/archive/2011/04/21/2024377.html转载 2017-05-09 11:35:01 · 159 阅读 · 0 评论 -
Uva12166
修改天平问题:首先以任意一个秤砣作为基点,假设为w,深度为depth,整个天平的重量就是w*2^depth (即w#include #include #include #include #include using namespace std;typedef long long LL;string line;map base; //LL表示总重量,int表示出现的次原创 2017-03-22 16:44:42 · 929 阅读 · 0 评论 -
uva10562
#include#includechar s[201][201],tree[400];int top,row;int dfs(int deep,int left,int right){int i,l,r; if (deep>row)return 0;//访问越界 for (i=left;i if ((转载 2017-03-12 19:44:09 · 349 阅读 · 0 评论 -
Uva816
#include#include#include#includeusing namespace std;struct Node { int r, c, dir; // 位于(r,c)朝向dir(0~3表示四个方向N, E, S, W) Node(int r=0, int c=0, int dir=0):r(r),c(c),dir(dir) {}};转载 2017-03-09 16:52:52 · 323 阅读 · 0 评论 -
Uva679
#include #include #include #include using namespacestd;const int maxn =20;int s[1maxn]; //最大节点个数位2^maxn - 1;int main(){ int D,I; while(scanf("%d%转载 2017-02-21 23:32:28 · 309 阅读 · 0 评论 -
hd2050
(1) n条直线最多分平面问题 题目大致如:n条直线,最多可以把平面分为多少个区域。 析:可能你以前就见过这题目,这充其量是一道初中的思考题。但一个类型的题目还是从简单的入手,才容易发现规律。当有n-1条直线时,平面最多被分成了f(n-1)个区域。则第n条直线要是切成的区域数最多,就必须与每条直线相交且不能有同一交点。这样就会得到n-1个交点。这些交点将第n条直转载 2016-11-25 17:39:35 · 168 阅读 · 0 评论 -
hdoj2048
Problem DescriptionHDU 2006'10 ACM contest的颁奖晚会隆重开始了!为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动,这个活动的具体要求是这样的:首先,所有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;然后,待所有字条加入完毕,每人从箱中取一个字条;最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”转载 2016-11-25 16:42:17 · 688 阅读 · 0 评论 -
HDU2577 How to Type
题意:输入一个字符串,判断需要按键的次数 有capslock shift两种切换大小写的方式思路:用dp记录capslock开关状态。dp[i][0]表示第i个字符capslock关闭的按键次数,dp[i][1]表示第i个字符capslock开启的按键次数。最后结果是min(dp[n][0],dp[n][1]+1);#include <iostream>#include <string.h>#i原创 2017-08-27 16:25:03 · 180 阅读 · 0 评论 -
POJ 1661 Help Jimmy
题解:jimmy跳到下一个平台,总是从当前平台的最左侧或者最右侧跳下去的。dp[i][0]表示从i个平台左边跳下去,dp[i][1]表示从第i平台右边跳下去。#include <iostream>#include <string.h>#include <cmath>#include <cstdio>#include <algorithm>using namespace std;const原创 2017-08-27 22:10:12 · 220 阅读 · 0 评论 -
hdu4597 PlayGame(区间dp)
题意:Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个只能从其中一个序列,选择两端中的一个拿走。他们都希望可以拿到尽量大的数字之和,并且他们都足够聪明,每次都选择最优策略。Alice先选择,问最终Alice拿到的数字总和是多少?题解:区间dp:f[i][j][k][l]表示第1列i到j,第二列k到l情况开始拿,最多可以拿多少,共有四种状态可以选择f[i+1][j][k][l原创 2017-09-03 17:46:34 · 196 阅读 · 0 评论 -
内部类详解
1、成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:class Circle { double radius = 0; public Circle(double radius) { this.radius = radius; } class Draw { //内部类 publ原创 2018-01-17 23:46:29 · 130 阅读 · 0 评论 -
hdu3635 Dragon Balls
题意:初始时,有n个龙珠,编号从1到n,分别对应的放在编号从1到n的城市中。 现在又2种操作: T A B,表示把A球所在城市全部的龙珠全部转移到B城市。(第一次时,因为A球所在的城市只有一个球,所以只移动1个,如果有多个,则全部移动)。 Q A,表示查询A。要求得到的信息分别是:A现在所在的城市,A所在城市的龙珠数目,A转移到该城市移动的次数(如果没有移动就输出0)题解:并查集,需要用到路径原创 2017-09-13 19:35:19 · 200 阅读 · 0 评论 -
hdu3605 Escape
题意:n个人,m个星球,输入一个n*m的01矩阵,0表示第i个人不居住在第j个星球,反之居住。接下来m个数表示第i个星球最多居住多少个人。求是否能够让所有人都居住在星球上题解:一开始以为是最大流的模版题,直接套模版,发现TLE了,因为人数是10e5,而m最大只有10,最多有2^10即1024中状态。所以对居住星球进行状态压缩,即每个状态有多少人居住,源点与状态连边,容量是该状态的人数,然后通过状态原创 2017-09-12 16:38:26 · 262 阅读 · 0 评论 -
hdu1532 Drainage Ditches(E-K最大流)
题意:输入m n, m是边数,n是点数。 接下来m行: 起点,终点,最大流量。求以 1 为源点, n为汇点的最大流。 #include<stdio.h>#include<string.h>#include<queue>#include<algorithm>#include<iostream>#define ms(a,b) memset(a,b,sizeof(a))usin原创 2017-09-07 00:16:29 · 247 阅读 · 0 评论 -
POJ2342 Anniversary party(树形dp)
题意话说一个公司的一些然要去参加一个party,每个人有一个愉悦值,而如果某个人的直接上司在场的话会非常扫兴,所以避免这样的安排,问给出n个人,每个人的愉悦值以及他们的上司所属关系,问你让那些人去可以让总的愉悦值最大,并求出这个值题解:状态转移方程:dp[state][1] += dp[i][0];dp[state][0] += max(dp[i][1],dp[i][0]); #inclu原创 2017-09-06 17:57:55 · 277 阅读 · 0 评论 -
POJ1185 炮兵阵地
题解:可以发现,对于每一行放大炮的状态,只与它上面一行和上上一行的状态有关,每一行用状态压缩的表示方法,0表示不放大炮,1表示放大炮,同样的,先要满足硬件条件,即有的地方不能放大炮,然后就是每一行中不能有两个1的距离小于2(保证横着不互相攻击),这些要预先处理一下。然后就是状态表示和转移的问题了,因为是和前两行的状态有关,所以要开个三维的数组来表示状态,当前行的状态可由前两行的状态转移而来。即如果当原创 2017-09-06 00:18:17 · 346 阅读 · 0 评论 -
poj3254 Corn Fields(状态压缩)
题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)题解:每排n块田,01排序,可以压缩成0-(1<<-1)个数字,判读该数字是否符合要求可以用x&(x-1)来判断。dp[i][state]表示第i行状态时state的情况有多少种。状态转原创 2017-09-06 00:02:14 · 265 阅读 · 0 评论 -
poj2229 Sumsets(dp)
题意:给定一个N,只允许使用2的幂次数,问有多少种不同的方案组成N。题解:对于n为奇数的时候,dp[n]=dp[n-1],因为一定包含一个1,这个1可以和dp[n-1]的所有情况相加。当n为偶数是,存在两种情况,一种是没有1,一种是两个1,没有1的情况是dp[n/2],存在两个1的情况是dp[n-2]。 LL dp[maxn]; void solve(){ dp[0] = 1原创 2017-09-05 13:21:34 · 167 阅读 · 0 评论 -
hdu5115 Dire Wolf(区间dp)
题意:有一群狼站成一排,每个狼有基础的攻击力,同时有一个辅助攻击力,每个狼的总攻击力是基础攻击力加上相邻的狼给予的辅助攻击力之和,求杀狼的次序使得收到的总攻击力之和最小。题解:区间dp,状态转移方程dp[l][r] = min(dp[l][r],DP(l,i)+DP(i,r)+a[i]+b[l]+b[r]);#include <iostream>#include <cstdio>#includ原创 2017-09-05 00:50:01 · 218 阅读 · 0 评论 -
hdu2473 Junk-Mail Filter(删点并查集)
题意:典型并查集的操作 合并两个点 从指定的集合中删去一个点 询问当前集合的个数题解:建立虚拟点,当点被孤立的时候,该点对应的点变化,即可模拟孤立点,后续关于该点的建立集合以新点为目标 #include <iostream>#include <set>using namespace std;const int maxn = 1e6*2+5;int f[maxn],id[maxn];i原创 2017-09-13 10:00:43 · 307 阅读 · 0 评论