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