昨天学习了bfs的基本概念,今天来做一道经典习题练练手吧!
bfs常用的两类题型
1.从A出发是否存在到达B的路径(dfs也可)
2.从A出发到B的最短路径(数小:<20才能用dfs)
遗留的那个问题的答案-
题目:走迷宫
#include <iostream>
using namespace std;
int n;
const int N=1005;
int a[N][N];
typedef long long ll;
ll dp[N][N][2];
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dp[i][j][0]=-1;
dp[i][j][1]=-1;
}
}
dp[1][1][0]=a[1][1];
dp[1][1][1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==1&&j==1)continue;
if(a[i][j]==-1||(dp[i-1][j][0]==-1&&dp[i][j-1][0]==-1)){
dp[i][j][0]=-1;
dp[i][j][1]=-1;
continue;
}
dp[i][j][0]=max(dp[i-1][j][0],dp[i][j-1][0])+a[i][j];
ll c1=dp[i-1][j][0]/(i+j-2)*a[i][j];
ll c2=dp[i][j-1][0]/(i+j-2)*a[i][j];
ll m1=max(c1+dp[i-1][j][0],c2+dp[i][j-1][0]);
ll m2=max(dp[i-1][j][1]+a[i][j],dp[i][j-1][1]+a[i][j]);
dp[i][j][1]=max(m1,m2);
}
}
cout<<max(dp[n][n][0],dp[n][n][1]);
}
int main()
{
// 请在此输入您的代码
ios::sync_with_stdio(0);
cin.tie(0);
int num=1;
while(num--)solve();
return 0;
}