算法读资料总结-搜索总结篇(6)

目录

1.综述

2.分类

3.各个类的处理模板

4.感悟


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.感悟

这种学习方法,确实让人收获很大,知识学完后应用,再回溯学习内容。可以更快,更多的学习知识。这种学习方式以后,我会更多的运用到,以后的学习中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值