题目链接:https://www.zhixincode.com/contest/1/problem/B?problem_id=13
题目大意:二维棋盘,从初始点到结束点,并且要求吃到至少C个豆豆,(i,j)在第秒会有豆豆出现,问需要花费的最少时间。
当时以为是暴搜。。 然后一听题解说dp就会了。。 思维障碍了
表示第k秒在(i,j)可以吃到的最多豆豆数量 上下左右中五个方向可以转移到
注意判断非法的情况
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
const int maxn=50000;
using namespace std;
int map[15][15];
int dp[15][15][maxn];
int n,m,c;
int a[5][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1}};
void work(int i,int j,int k)
{
int ans=-1;
int x,y;
for(int s=0;s<5;s++)
{
x=i+a[s][0];
y=j+a[s][1];
if(x>=1&&x<=n&&y>=1&&y<=m&&dp[x][y][k-1]>=0)
{
ans=max(ans,dp[x][y][k-1]);
}
}
dp[i][j][k]=ans;
if(dp[i][j][k]!=-1&&k%map[i][j]==0)dp[i][j][k]++;
}
int main()
{
cin>>n>>m>>c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
}
}
int xs,ys,xt,yt;
cin>>xs>>ys>>xt>>yt;
memset(dp,-1,sizeof(dp));
dp[xs][ys][0]=0;//合法
int ans=100000000;
for(int k=1;k<maxn;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
work(i,j,k);
if(i==xt&&j==yt&&dp[i][j][k]>=c)
{
cout<<k<<endl;
return 0;
}
}
}
}
//cout<<ans<<endl;
return 0;
}