上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 30 下一页
摘要: /*字符串DP,但是要找到用最小的字符串来匹配,所以用dp储存当前所使用过的字符串数。打印路径的话直接用数组表示前缀*/#include <iostream>#include <string>#include <cstring>#include <cstdio>using namespace std;string s = "22233344115566070778889990";#define X 50010int dp[X],pre[X],len[X],p[X],L;string a[X],in[X],b;void chan 阅读全文
posted @ 2012-04-30 16:01 yejinru 阅读(207) 评论(0) 推荐(0) 编辑
摘要: /*题目: 把石头分成两堆,问最小的重量差值为多少。分析: 先求和,然后用和的一半转为01背包。转移方程为: dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+w[i]); 缩小维度后为dp[j] = max(dp[j],dp[j-w[i]]+w[i]);*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int X = 2000010;int dp[X],w[25],n;int main(){ freopen(& 阅读全文
posted @ 2012-04-30 15:53 yejinru 阅读(223) 评论(0) 推荐(0) 编辑
摘要: /*题目: 寻找图中的最小环,输出路径。分析: 可以通过枚举删除其中的一条边,看看能否从该边的一点走到另一点,若能并且该最短路的长度加上 删除的边的长度小于当前的最优解的话,更新路径与最优解。而打印路径可以通过数组来表示该点的 前一顶点,然后递归打印路径即可。最短路可以通过dijkstra算法求出。估计的时间复杂度为O(n^2*E)。 我交了一下,用时:1.328 内存:264 KB*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int X = 阅读全文
posted @ 2012-04-30 10:03 yejinru 阅读(314) 评论(0) 推荐(0) 编辑
摘要: /*题目: 冰球游戏,每次都得需要往左右前后移动相应的步数,只有遇到石块才会停止在石块前,不然的话 就要出界。问如何从出发点移动冰球使它到达终点,若不能输出-1,可以的话输出最小的移动次数。 另外超出十次还没移动到终点的话,也算输分析: 由于长和宽都最大只有20,另外也同样只有十次而已,所以可以用深搜来做。每次先判断需要移动的 到哪个位置,然后判断到达终点时的总移动次数是否大于10,没有则更新答案。另外需要注意的是, 每次移动时都需要先对该位置碰到的石块置空,然后递归搜索该位置是否能到达终点,递归完了之后 需要对地图位置置为1,代表原来的位置为石块。*/#include <iostrea 阅读全文
posted @ 2012-04-26 17:28 yejinru 阅读(183) 评论(0) 推荐(0) 编辑
摘要: /*题目: 给出一个点的坐标以及以它为半径的半圆,现给出所有的零散的点的坐标,问最多半圆能覆盖的点的数目分析: 先预处理完所有的点到圆心的距离,然后排序得到所有可以在整个圆上的点,再枚举其中一个点作为 半圆的一条半径,再用叉积分>=0和<=0分成两类,判断这两个与答案的最大值,更新后输出答案*/#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>using namespace std;#define MAXN 160#define esp 1e 阅读全文
posted @ 2012-04-22 20:23 yejinru 阅读(194) 评论(0) 推荐(0) 编辑
摘要: /*题目: 求两线段是否重合、平行或相交分析: 利用叉积运算很容易算出来,我们可以先判断是否是平行的,只需将每一段线段向量化,再与另一个 向量做叉积运算,若为0即平行或重合,判断是否重合,只需找其中一个向量与该向量的一端与另一向量 的一端组成的向量做叉积运算,为0即为重合。 不平行的话,那么在本题中有一个交点,可以求到两线段分别所在的直线(ax+by+c=0),然后联立方程解出 x,y即可(这是我自己做的方法,可能有些漏洞,网上有很多模板)*/#include <iostream>#include <cstdio>#include <cmath>using 阅读全文
posted @ 2012-04-13 07:23 yejinru 阅读(367) 评论(0) 推荐(0) 编辑
只有注册用户登录后才能阅读该文。 阅读全文
posted @ 2012-04-10 11:34 yejinru 阅读(9) 评论(0) 推荐(1) 编辑
摘要: /*题目: 就是所在矩形中有一些外星人,一些人组队打怪去,可以分很多支队,问这些队一共所需的 最少移动步数分析: 由于可以分很多队,所以可以看做是从起点出发求最小生成树(其实有无起点一样,MST肯定 包括起点),于是问题转换为求最小生成树。怎样处理点与点之间的距离。其实每两个点之间 肯定存在通路,而任两点之间的最小直接距离可以通过bfs求到,于是可以通过枚举所有的点 (即外星人和起点)到另外的点(还是外星人和起点)的距离。具体实现看代码*/#include <iostream>#include <cstring>#include <cstdio>#inclu 阅读全文
posted @ 2012-04-09 22:37 yejinru 阅读(163) 评论(0) 推荐(1) 编辑
摘要: /*贪心: 当为6*6时,只能用一个盒子装 当为5*5时,可以每一个多装11个1*1的盒子 当为4*4时,可以先装2*2的盒子,每一个4*4的可以装5个2*2,若2*2不够,则装1*1的 当为3*3时,每一个可以装4个3*3,若最后不足4个,先用2*2的装,空余的位置用1*1装 当为2*2时,每一个可以装9个2*2的,最后有剩余装1*1的 若最后还有1*1的,每36个可以装一盒,多的算多一盒*/#include <iostream>#include <cstdio>using namespace std;#define X 7int a[X];int main(){ f 阅读全文
posted @ 2012-04-07 21:09 yejinru 阅读(156) 评论(0) 推荐(0) 编辑
摘要: /*题目: 象棋中的车在象棋盘上可以放置的最大数目(若没有挡板的话,在同一行或同一列的车 可以相互攻击,问的是所有的车可以和平地放置的最大数目)分析: 方法一: 可以通过暴搜得到答案(题目数据较小) 方法二: 可以通过构造二分图的方法来做,以下主要分析二分图的解法方法: 我们将每一行,每一列被墙隔开,且包含空地的连续区域称作“块”。显然,在一个块之中, 最多只能放一个车。我们把这些块编上号。 同样,把竖直方向的块也编上号。 把每个横向块看作X部的点,竖向块看作Y部的点,若两个块有公共的空地,则在它们之间连边。 于是,问题转化成这样的一个二部图: .X.. .... XX.. .... 我们可以 阅读全文
posted @ 2012-04-07 19:33 yejinru 阅读(243) 评论(0) 推荐(2) 编辑
上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 30 下一页