CDOJ 1271 Search gold

时间:2023-03-09 06:20:40
CDOJ 1271 Search gold

简单DP。dp[i][j]表示走到这格的最大金钱数。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; const int maxn=+;
int n,m;
int a[maxn][maxn],dp[maxn][maxn]; bool f(int a,int b)
{
if(a>=&&a<=n&&b>=&&b<=m) return ;
return ;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
scanf("%d",&a[i][j]); memset(dp,-,sizeof dp); dp[][]=a[][]; int newx,newy;
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
{
if(dp[i][j]==-) continue;
newx=i;
newy=j+; if(f(newx,newy))
{
if(dp[i][j]+a[newx][newy]>=)
dp[newx][newy]=max(dp[newx][newy],dp[i][j]+a[newx][newy]);
} newx=i+;
newy=j; if(f(newx,newy))
{
if(dp[i][j]+a[newx][newy]>=)
dp[newx][newy]=max(dp[newx][newy],dp[i][j]+a[newx][newy]);
} newx=i+;
newy=j+; if(f(newx,newy))
{
if(dp[i][j]+a[newx][newy]>=)
dp[newx][newy]=max(dp[newx][newy],dp[i][j]+a[newx][newy]);
} newx=i+;
newy=j+; if(f(newx,newy))
{
if(dp[i][j]+a[newx][newy]>=)
dp[newx][newy]=max(dp[newx][newy],dp[i][j]+a[newx][newy]);
}
} int ans=dp[][];
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
ans=max(ans,dp[i][j]); printf("%d\n",ans);
return ;
}