20pts求助
查看原帖
20pts求助
405762
tmy_sam楼主2020/11/10 19:48
#include<bits/stdc++.h>

using namespace std;

const int maxN=1005;
int maap[maxN][maxN];
long long smax[maxN][maxN][3];//from up=0 left=1 down=2
int n,m;
int main(void){
    //use DP algorithm
    //min score for each block
    //input
    cin>>n>>m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&maap[i][j]);
            smax[i][j][0]=-1e14;
            smax[i][j][1]=-1e14;
            smax[i][j][2]=-1e14;
        }
    }
    smax[0][0][0]=maap[0][0];
    smax[0][0][1]=maap[0][0];
    smax[0][0][2]=maap[0][0];
    //dp
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(i==0&&j>0){
                smax[j][i][0]=maap[j][i]+smax[j-1][i][0];
            }else{
                if(j==0&&i!=0){
                    smax[j][i][0]=maap[j][i]+max(smax[j][i-1][0],max(smax[j][i-1][1],smax[j][i-1][2]));
                    smax[j][i][1]=maap[j][i]+max(smax[j][i-1][0],max(smax[j][i-1][1],smax[j][i-1][2]));
                }
                if(j>0){
                    smax[j][i][1]=maap[j][i]+max(smax[j][i-1][0],max(smax[j][i-1][1],smax[j][i-1][2]));
                    smax[j][i][0]=maap[j][i]+max(smax[j-1][i][0],smax[j-1][i][1]);
                }
            }
        }
        for(int j=n-1;j>=0;j--){
            if(j==n-1){
                smax[j][i][2]=maap[j][i]+max(smax[j][i-1][0],max(smax[j][i-1][1],smax[j][i-1][2]));
            }
            if(j<n-1){
                smax[j][i][2]=maap[j][i]+max(smax[j+1][i][1],smax[j+1][i][2]);
            }
        }
    }
    //THIS IS FOR DEBUGGING
    //for(int i=0;i<n;i++){
    //    for(int j=0;j<m;j++){
    //        printf("%d ",max(max(smax[i][j][0],smax[i][j][1]),smax[i][j][2]));
    //    }
    //    printf("\n");
    //}
    //printf("##################\n");
    printf("%d",max(smax[n-1][m-1][0],smax[n-1][m-1][1]));
}

过#2 #4 #10 #17 能过两个小样例

2020/11/10 19:48
加载中...