目录
1.综述
70多道题,看了一半,A了1/6。
题目看多了,也就能大致分出类型了,正如算法,一个算法可以解决一类问题,在细节上可能会有细微的差别。在敲代码能力,和细节处理上还得进一步加强,因为很多题做了之后,虽然得分了,但是得60,甚至更低,这就有点难受了。所以要进一步加强练习和学习。
2.分类
矩形中搜索数目类:P1451 求细胞数量 P1331 海战 P1506 拯救oibh总部 P1506 拯救oibh总部 P2802 回家 P1141 01迷宫 P1189 `SEARCH` P1123 取数游戏 .......
数据处理类:P1036 选数 P1460 健康的荷斯坦奶牛 Healthy Holsteins
P1596 Lake Counting S P7200 Lutrija
P2853 Cow Picnic S P2419 Cow Contest S ........
数据排列类:P1706 全排列问题 P1030 求先序排列 .......
3.各个类的处理模板
矩形中搜索数目类:这类的题用dfs,主要需要确定算法和考虑标记状态,之后一直走下去
void dfs(int x,int y){//搜索函数,表示搜索点(x,y)
if(y==m+1){//当y到边界时,搜索下一行
dfs(x+1,1);
return;
}
数据处理类:主要是对数据搜索,标记,再回溯的过程
{
f[i]=false;//标志该数已经被选过
s+=a[i];//将相对应的值累加到s中
if(x==k)//如果已经加到了k个数,则运行下列语句
{
if(ss(s))ans+=1;//判断和是否为素数,如果是素数,则ans+=1,标志情况多了一种
}
else xs(x+1,i+1);//若还未加到k个数,则继续搜寻下一个数,所以x+1。i+1则是为了
//搜寻当前数的下一个数,避免重复
s-=a[i];//回溯,累加器s减去a[i]的值
f[i]=true;//f[i]还原true,没有被选过
//注意:两句回溯语句一定要放在else外面,x==k时无法继续往下搜寻,也需要回溯
}
数据排列类:先进行排列再搜索
for(int i=1;i<=n;i++)//从小到大枚举
if(!use[i]){//判断这个数是否用过
ans[x]=i;//保存到方案中
use[i]=1;//标记这个数被使用了
dfs(x+1);//进行下一步搜索
use[i]=0;//撤销标记
}
4.感悟
这种学习方法,确实让人收获很大,知识学完后应用,再回溯学习内容。可以更快,更多的学习知识。这种学习方式以后,我会更多的运用到,以后的学习中。