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
阅读全文
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
阅读全文
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;
阅读全文
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[
阅读全文
POJ 2227
摘要:题意:一个矩形区域,高低起伏,求最多储水量。(边界不能储水)题解:先将边界装入优先队列中(高度越小越优先),并标记为已访问。看队首元素四周未访问过的点,1、如果该点不比队首低,则将它加入队列,标记为已访问,即它变成了新的边界。2、该点比队首低,意味着该点可以储水,更新ans值,同时将它加入队列中,但是它的高度为原队首元素的高度,即以它为边界的点不能超过这个高度,同时将该点标记为已访问。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<que
阅读全文
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=='(
阅读全文
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<
阅读全文
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
阅读全文
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>
阅读全文
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&
阅读全文
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 ...
阅读全文
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
阅读全文
POJ 2573
摘要:还有一道比这道题更简单但是一样的题,忘了题号了,那题只求最少时间,实际上两题差不多,贪心策略1、让划船划的最快的人依次与最慢的两人组队去对面,然后他在把船划回来,这样到对岸的时间花费很多,但是回来的时间少。2、先让最快的两人去对岸,然后让其中一人把船划回来,再让最慢的两人组队去对岸,让先前还剩下那人把船划回来,这样使得到对岸的时间减少了,但是划回来的时间增多了。依靠上面两个贪心策略,执行一次后得到的状态都是相等的,于是可以递归解决,每次进行比较,看哪种贪心策略更优,直到要过河的人小于4#include<cstdio>#include<cstring>#include&l
阅读全文
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
阅读全文
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 ...
阅读全文
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 ...
阅读全文
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 ...
阅读全文
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
阅读全文
|
|
|