• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
tmeteorj
Nothing is so big that it is impossible to get over, and hurt only serves to make us stronger. 没有什么事是大到无法战胜的,痛苦也只会让我们变得更加坚强。
博客园 | 首页 | 新随笔 | 新文章 | 联系 | 订阅 订阅 | 管理

随笔分类 -  ACM 搜索

上一页 1 2

 
POJ 2157
摘要:题意:人走迷宫,起点S,终点G,A/B/C/D/E为门,要开A必须集齐地图上所有的a,依次类推,问最后能否到G。题解:从起点出发,dfs所有能到的点,其中,遇到门但没凑够钥匙就将该点标记,代表能到它,遇到钥匙就将还需要凑的钥匙减一。然后每次dfs一遍后,查看所有的被标记了的门,如果钥匙够了就从该点出发再进行一次dfs。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cctype> 5 using namespace std; 6 i 阅读全文
posted @ 2012-09-28 20:02 tmeteorj 阅读(332) 评论(0) 推荐(0)
POJ 3272
摘要:题意:n个点m条边的有向图,从所有入度为0的点出发到达n,问所有可能路径中,经过的某条路的最大次数是多少。边全是由标号小的到标号大的。题解:正向走一遍,记录到达某点的路径总数,反向走一遍,记录某点出发到终点的总情况数。枚举每条边,求边对应两点所记录的两个信息之积的最大值。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=5005; 6 typedef long long ll; 7 int he 阅读全文
posted @ 2012-09-27 16:56 tmeteorj 阅读(438) 评论(0) 推荐(0)
POJ 3279
摘要:题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略。题解:枚举第一行翻转情况,2^c,然后验证,由于第一行确定了,后面就可以跟着确定了。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int map[20][20]; 6 int hit[20][20],ahit[20][20]; 7 int ans,r,c; 8 const int inf=1<<30; 阅读全文
posted @ 2012-09-26 21:19 tmeteorj 阅读(1780) 评论(0) 推荐(0)
POJ 1240
摘要:题意:给定一颗多叉树(<=20)的先序和后序遍历结果,求这种树共有多少。题解:考虑产生相同先序遍历和后序遍历的两种树,S和T,他们每个相同结点对应的孩子数目应该相等,因为假如S某个结点有s个孩子,他们在先序和后序遍历中的顺序是一致的,要想两棵树先序遍历与后序遍历一致,则他们每一个结点的孩子都应该有这种特点。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 ll c[ 阅读全文
posted @ 2012-09-26 18:51 tmeteorj 阅读(387) 评论(0) 推荐(0)
POJ 2227
摘要:题意:一个矩形区域,高低起伏,求最多储水量。(边界不能储水)题解:先将边界装入优先队列中(高度越小越优先),并标记为已访问。看队首元素四周未访问过的点,1、如果该点不比队首低,则将它加入队列,标记为已访问,即它变成了新的边界。2、该点比队首低,意味着该点可以储水,更新ans值,同时将它加入队列中,但是它的高度为原队首元素的高度,即以它为边界的点不能超过这个高度,同时将该点标记为已访问。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<que 阅读全文
posted @ 2012-09-25 21:18 tmeteorj 阅读(715) 评论(0) 推荐(0)
POJ 2955
摘要:题意:给一个括号串,求最大匹配。题解:记忆化搜索,dp[i][j]为[i,j]的最大匹配,dp[i][j]=max(dp[i+1][j-1]+corr(s[i],s[j]),dp[i][k]+dp[k+1][j]);View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int dp[105][105]; 6 char s[105]; 7 int corr(char a,char b) 8 { 9 if((a=='( 阅读全文
posted @ 2012-09-25 15:04 tmeteorj 阅读(325) 评论(0) 推荐(0)
POJ 3322
摘要:题意:在r*c的矩形方格地图中,有钢地板和易碎地板,分别以'.'和'E'代替。有个1*1*2的长方体,在这上面滚动,要使它最后立在目标位置上(就是只占一格且在目标上),长方体初始位置用'X'表示,目标用'O'表示。题解:bfs,记录长方体左上角的点的位置以及它的摆放位置(立着:0,横躺着:1,竖躺着:2),然后就可以用mark[505][505][3]的bool数组记录是否走过某点了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include< 阅读全文
posted @ 2012-09-24 20:01 tmeteorj 阅读(394) 评论(0) 推荐(0)
POJ 1390
摘要:题意:给定n个不同颜色的盒子,连续的相同颜色的k个盒子可以拿走,权值为k*k,求把所有盒子拿完的最大权值。题解:记忆化搜索,dp[ll][rr][kk]代表在区间[ll,rr]取盒子,其中ll前面有k个盒子颜色和rr一样,可以重叠在rr上消去。 那么,dp[ll][rr][kk]=max(dp[ll][i][kk+len[rr]]+dp[i+1,rr-1][0],dp[ll][rr-1][0]+pow(len[rr]+kk)),i是所有位于[ll,rr-1]区间且与rr颜色相同的盒子;View Code 1 #include<cstdio> 2 #include<cstrin 阅读全文
posted @ 2012-09-24 18:55 tmeteorj 阅读(624) 评论(0) 推荐(0)
POJ 1475
摘要:题意:推箱子,要求箱子移动步骤最小。题解:双重bfs,先对箱子bfs,然后判断这种bfs是否可达(对人bfs)。题解本来很简单,但是这题数据SPJ方式各种坑,已经说不上坑了,就是错的。网上各种AC代码也是过不了一些数据,例如:5 5.......###....T#B####S###遍历的时候还要限制顺序才能A,好TM无语。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<string> 5 #include<cctype> 阅读全文
posted @ 2012-09-24 10:57 tmeteorj 阅读(594) 评论(0) 推荐(0)
POJ 3716
摘要:题意:给4个骰子,每面染有红色或者蓝色,概率相等,然后告诉你前两次扔后红色面朝上的骰子各有几个,问你再扔一次红色面朝上概率是多大题解:对于推不出公式的童鞋就只好爆搜了,但是,条件概率公式还是要知道才行,即P(A|B)=P(B|A)*P(A)/P(B),通过这个,单独看每一个骰子,可以求出当掷出骰子状态为00,01,10,11时骰子6面为t时的概率。 接着,就是4^4枚举每个骰子状态*7^4枚举每个骰子染色状况*2^4计算期望,然后,还100MS+给过了View Code 1 #include<cstdio> 2 #include<cstring> 3 #include& 阅读全文
posted @ 2012-09-17 21:02 tmeteorj 阅读(482) 评论(0) 推荐(0)
POJ 3050
摘要:题意:问从5*5的矩阵中选连续的6个组成的字符串有多少种题解:dfsView Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<set> 5 using namespace std; 6 int map[6][6]; 7 set<int> ss; 8 void dfs(int x,int y,int res,int k) 9 {10 if(k==6)11 {12 ss.insert(res);13 return;14 }15 ... 阅读全文
posted @ 2012-09-15 19:22 tmeteorj 阅读(479) 评论(0) 推荐(0)
POJ 2442
摘要:直接用优先队列bfs+set判重水过,需要注意的是,因为m<=100,所以用short就可以不超内存了= =!View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 #include<set> 6 using namespace std; 7 int ar[105][2005],n,m; 8 struct data 9 {10 short p[105];11 int sum;12 bool operato 阅读全文
posted @ 2012-09-08 19:27 tmeteorj 阅读(325) 评论(0) 推荐(0)
POJ 2573
摘要:还有一道比这道题更简单但是一样的题,忘了题号了,那题只求最少时间,实际上两题差不多,贪心策略1、让划船划的最快的人依次与最慢的两人组队去对面,然后他在把船划回来,这样到对岸的时间花费很多,但是回来的时间少。2、先让最快的两人去对岸,然后让其中一人把船划回来,再让最慢的两人组队去对岸,让先前还剩下那人把船划回来,这样使得到对岸的时间减少了,但是划回来的时间增多了。依靠上面两个贪心策略,执行一次后得到的状态都是相等的,于是可以递归解决,每次进行比较,看哪种贪心策略更优,直到要过河的人小于4#include<cstdio>#include<cstring>#include&l 阅读全文
posted @ 2012-09-06 21:06 tmeteorj 阅读(375) 评论(0) 推荐(0)
POJ 2082
摘要:题目,水。题目描述,坑爹。感觉在玩文字狱TOT#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int x[50005],y[50005],left[50005],right[50005];int main(){ int n; while(scanf("%d",&n)&&n!=-1) { x[0]=y[0]=0; y[n+1]=0; left[0]=0;right[n+1]=n+1; for(int i=1;i<=n 阅读全文
posted @ 2012-09-05 21:26 tmeteorj 阅读(250) 评论(0) 推荐(0)
POJ 1248
摘要:有很多这样的题,给一个这样的集合,让你去找几个数使他们加起来满足什么条件,一般要找4~6个数什么的,直接做就会超时,可以折半找2~3个数并将它们结果存起来,再另找2~3个数去验证。这样讲n^4~n^6就变成了n^2~n^3(用hash的话)View Code 1 import java.util.*; 2 import java.math.*; 3 class Main 4 { 5 static int pow(int a,int n) 6 { 7 int ans=1; 8 while(n>0) 9 {10 ... 阅读全文
posted @ 2012-09-01 08:51 tmeteorj 阅读(242) 评论(0) 推荐(0)
POJ 2738
摘要:没什么好想的,就是一个记忆化搜索。我第一次居然想爆搜~~~View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int a[1005]; 6 int dp[1005][1005]; 7 int dfs(int left,int right) 8 { 9 if(dp[left][right]!=-1)10 return dp[left][right];11 else if(left==right-1)12 {13 ... 阅读全文
posted @ 2012-08-30 17:37 tmeteorj 阅读(408) 评论(0) 推荐(0)
POJ 2897
摘要:dfs搜索,实际上每次只有一个前进的方向,记录进位与当前位,用一个bool标记即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int n,k; 5 bool ok,g[10][10]; 6 void dfs(int res,int add) 7 { 8 if(res*n+add==k) 9 {10 ok=true;11 return;12 }13 else if(g[res][add])14 {15 ... 阅读全文
posted @ 2012-08-29 18:36 tmeteorj 阅读(173) 评论(0) 推荐(0)
POJ 2154
摘要:由Polya定理可得到最后结果等于1/N*∑N^gcd(i,n);可是,N≤10^9,枚举i明显会超时,但gcd(i,n)最后得到的结果很少,最多1000多个,于是反过来枚举gcd(i,n)的值L,L即n的某个约数,那么我们需要找到0~n-1中有多少个数与n的约数是L,由扩展欧几里得可以知道,必然存在x,y使得i*x+n*y=L,由于L是i,n最大公约数,所以可以变成(i/L)*x+(n/L)*y=1,同时mod(n/L),(i/L)*x≡1(mod n/L),即,要找与n/L互质的i/L有多少个,变成欧拉函数了!于是,最后答案就变成了∑φ(n/L)*N^(L-1),dfs+快速幂取模搞定#i 阅读全文
posted @ 2012-08-29 17:23 tmeteorj 阅读(326) 评论(0) 推荐(0)
 

上一页 1 2

公告


博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3