蓝桥杯跳跃问题

题目链接:https://www.lanqiao.cn/problems/553/learning/

题目比较清晰,这里提供两种思路供于参考;;

先说第一种思路,dfs暴搜

爆搜就不用多说了,直接开搜

需要注意的是,按照题目要求只能一个方位最大只能走九个方位,然后按照题目的要求设计就行了

这个是演算时候的草稿,随便看看就行了

详细情况以及注意事项请看注释

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[110][110];
 4 int  n,m;
 5 int dir[9][2]={{0,1},{0,2},{0,3},{1,0},{1,1},{1,2},{2,0},{2,1},{3,0}};//九个方位 
 6 int ans=INT_MIN;//烧饼作用不用对说了吧 
 7 bool vis[110][110];//标记数组 
 8 void dfs(int x,int y,int sum)
 9 {
10     vis[x][y]=1;//标记 
11     if(sum<=ans)//剪枝 
12     return ;
13      if(x==n&&y==m)//返回条件 
14     ans=sum;
15     //下面开搜 
16     for(int i=0;i<9;i++)
17     {
18         int newx=x+dir[i][0];
19         int newy=y+dir[i][1];
20         if(newx>=1&&newy>=1&&newx<=n&&newy<=m&&vis[newx][newy]==0)//边界条件以及满足情况的(没有走过的路) 
21         {
22             dfs(newx,newy,sum+a[newx][newy]);//下一层 
23             vis[newx][newy]=0;//回溯 
24         }
25     }
26 }
27 int main()
28 {
29     ios::sync_with_stdio(false);
30     memset(vis,0,sizeof(vis));
31       cin>>n>>m;
32   for(int i=1;i<=n;i++)
33   {
34     for(int j=1;j<=m;j++)
35     {
36       cin>>a[i][j];
37     }
38    }
39    dfs(1,1,a[1][1]);
40    cout<<ans<<endl;
41   return 0;
42 }

下面采用动态规划做法:

其实也是很常规的动态规划,不过较dfs来说还是搜索更为明确一些

下面提供dp思路以及注意事项:

#pragma GCC optimize(2)//手写 
#include<bits/stdc++.h>
using namespace std;
int dp[110][110];//走到最大的值 
int ans;//能够到达此点的所有点的权值最大值 
int n,m; 
int x[9]={0,0,0,-1,-1,-1,-2,-2,-3};//九个方位 
int y[9]={-3,-2,-1,-2,-1,0,-1,0,0};//九个方位 
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(register int i=1;i<=n;i++)
	{
		for(register int j=1;j<=m;j++)
		cin>>dp[i][j];
	}
	for(int i=1;i<=n;i++)
	{
		for(register int j=1;j<=m;j++)
		{
			ans=INT_MIN;//烧饼 
			for(int k=0;k<9;k++)
			{
				if(i+x[k]>=1&&j+y[k]>=1)//不是在原来的位置即已经出发了 
				ans=max(ans,dp[i+x[k]][j+y[k]]);//转移方程——它本身和下一个位置谁更大 
			}
			if(ans!=INT_MIN)
			{
				dp[i][j]+=ans;//更新该点的权值,用旧值来覆盖 
			}
		}
	}
	cout<<dp[n][m]<<endl;
	return 0;
}

  

posted @ 2022-03-01 21:19  江上舟摇  阅读(398)  评论(0编辑  收藏  举报