2014年蓝桥杯A组真题 1.地宫取宝 知识点:记忆化搜索

97 阅读2分钟

1.地宫取宝 - 蓝桥云课 (lanqiao.cn)

题目说了只能向下或者向右走,且面对每一个最大价值物品时都有取和不取两种选择。且在最后走出地宫时小明拿的物品数量必须刚好是K个物品。

地宫最大是50行50列,用dfs写如下代码。

#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9+10; 
int g[50][50];
int ans;
int n,m,k;
void dfs(int x,int y,int Max,int cnt)
{
	int cur=g[x][y];
	
	//越界的情况
	if(x==n||y==m)return;
	
	//即将面临最后一步 
	if(x==n-1&&y==m-1)
	{
		if(cnt==k)
		{
		  ans++;  //如果此时cnt已经满足了 k ,那么最后一个物品拿不拿都无所谓
	      if(ans>MOD)ans%=MOD;
		}
		
		if(cnt==k-1&&cur>Max) 
		{
			 
		  ans++;  //如果还差一件才拿够 并且最后一件商品价值较大,那就拿上 
		  if(ans>MOD)ans%=MOD;
     	}
	 } 
	
	
	if(cur>Max)	//如果当前格子中的宝贝价值比小明手中任何宝贝的价值都大  就可以取(也可以不拿) 
	{
		//拿的情况 
	   dfs(x,y+1,cur,cnt+1);  //cur更新为最大价值 
	   dfs(x+1,y,cur,cnt+1);  //cur更新为最大价值	
	

	} 	
	  //面对当前格子中的物品价值较小 或价值较大时 不拿的情况
	   dfs(x,y+1,Max,cnt);   //不拿的话Max保持不变 
	   dfs(x+1,y,Max,cnt);   //不拿的话Max保持不变 
} 


int  main()
{
  cin>>n>>m>>k;
   for(int i=0;i<n;i++)
   {
   	  for(int j=0;j<m;j++)
      {
         cin>>g[i][j];	
	  }
	} 
	
	
	dfs(0,0,-1,0);
	
	
	cout<<ans<<endl; 
return 0;
} 

因为每次都有四种选择:

向右走取当前物品

向右走不取当前物品

向下走取当前物品

向下走不取当前物品

而整个地图是50×50的,也就是需要向右走50次,向下走50次,要走100个点。每个点除了边界外都有四种选择。

image.png

也就是总共有 41004^{100}种选择,我们知道21002^{100}可以看做210102^{10^{10}}就是2102^1010241024,1024101024^{10}大概10610^{6},所以41004^{100}一定超过了1e91e9