题目链接: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; }