#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int A[1002][1002]= { { 0}};
int L[1002][1002]= { { 0}};
int R[1002][1002]= { { 0}};
int D[1002][1002]= { { 0}};

int main()
    int n;
    int i,j;
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);

    scanf("%d",&n);

    for(i=1; i<=n; i++)
    { 
        for(j=1; j<=n; j++)
        { 
            scanf("%d",&A[i][j]);
        }
    }


    for(i=1; i<=n; i++)
    { 
        L[i][1]=D[i-1][1]+A[i][1]; //1열에 대한 처리
        if(i>1) //2행 이후에 대한 처리
        { 
            for(j=2; j<=n; j++)
            { 
                L[i][j]=max(L[i][j-1],D[i-1][j])+A[i][j];
            }
        }
        else //1행에 대한 처리
        { 
            for(j=2; j<=n; j++)
            { 
                L[i][j]=L[i][j-1]+A[i][j];
            }

        }

        //R[1][j]는 초기화된 0 그대로 둠 (A[1][1]부터 시작이므로 역방향은 불가능)
        if(i>1)
        { 
            R[i][n]=D[i-1][n]+A[i][n];
            for(j=n-1; j>=1; j--)
            { 
                R[i][j]=max(R[i][j+1],D[i-1][j])+A[i][j];
            }
        }

        for(j=1; j<=n; j++)
        { 
            if(i>1)
            { 
                D[i][j]=max(L[i][j],R[i][j]);
            }
            else
            { 
                D[i][j]=L[i][j];
            }

        }
    }
    printf("%d",D[n][n]);

    return 0;
}


==================================================


#include <cstdio>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;

typedef struct
{
int height;
int price;
} picture;

bool compare(picture p1, picture p2){
return p1.height < p2.height;
}

int main()
{
        time_t start, end;

int N, S, i;
int max=-9999999;
vector<picture> pic;
vector<int> idx;

freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);

scanf("%d %d",&N,&S);
pic.resize(N);
idx.resize(N);
for(i=0;i<N;i++)
{
scanf("%d %d",&(pic[i].height),&(pic[i].price));
idx[i]=i;
}
// 높이를 기준으로 정렬
// sort(pic.begin(),pic.end(),compare);

// 높이를 기준으로 사전식 순열
start=time(NULL);
do
{
int sum=0;
int lastPicHeight=0;
for(i=0;i<N;i++)
{
if(pic[idx[i]].height>lastPicHeight)
{
if((pic[idx[i]].height-lastPicHeight)>=S)
{
sum+=pic[idx[i]].price;
}
lastPicHeight=pic[idx[i]].height;
}
}
if(max<sum) max=sum;
                end=time(NULL);
                if(difftime(end,start)>0.98) break;
}while(next_permutation(idx.begin(),idx.end()));
printf("%d",max);
return 0;
}