题目链接:http://acm.uestc.edu.cn/#/problem/show/1271
题意:一个N*M的矩阵,每个格子有一个数,然后每个人在某一个格子有4种走法,然后问从(1,1)出发能得到的最大价值。
解法:
矩阵DP
算法复杂度:0(N*M)
memset(dp,-1,sizeof(dp));dp[1][1]=a[1][1];
dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-2],dp[i-2][j-1])>=0?max(dp[i-1][j],dp[i][j-1],dp[i-1][j-2],dp[i-2][j-1])+a[i][j]:-1
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n,m,a[maxn][maxn], dp[maxn][maxn];
bool check(int x, int y){
if(x>=1&&x<=n&&y>=1&&y<=m) return 1;
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
memset(dp,-1,sizeof(dp));
dp[1][1]=a[1][1];
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
if(i==1&&j==1) continue;
int mx = -100000000;
if(check(i-1,j)) mx=max(mx,dp[i-1][j]);
if(check(i,j-1)) mx=max(mx,dp[i][j-1]);
if(check(i-1,j-2)) mx=max(mx,dp[i-1][j-2]);
if(check(i-2,j-1)) mx=max(mx,dp[i-2][j-1]);
if(mx>=0){
dp[i][j]=mx+a[i][j];
}
else{
dp[i][j]=-1;
}
}
}
int ans=-1000000;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
ans=max(ans,dp[i][j]);
printf("%d\n", ans);
return 0;
}