스키

7362 단어 OJ
dp[

i][j]=max(네 방향점)+1;네 방향의 점이 존재해야 하며 i, j보다 크면 i, j로 시작하는 점의 가장 긴 경로를 나타낸다. 귀속의 끝 조건은 판단할 필요가 없다. 왜냐하면


dp[][]의 최대 위치는 틀림없이 바로 끝날 것이다. 그 다음에 큰 값은 반드시 끝날 것이다. 이런 식으로 추측하기 때문에 실행할 수 있지만 아래에서 위로 동태적인 계획은 쓰기 어렵다.이 수의 크기를 확인해야 하기 때문에, 번거롭다.


 
 
#include<iostream>

#include<memory.h>

using namespace std;

int dp[101][101];

int arr[101][101];

int c;

int r;

int x[]={0,1,0,-1};



int y[]={1,0,-1,0};





bool isvalid(int row,int col,int r_off,int c_off)  //          ,    arr[i][j] 

{

    int newr=row+r_off;

    int newc=col+c_off;

    if(newr>=0&&newr<r&&newc>=0&&newc<c&&arr[row][col]<arr[newr][newc])

    {

         return true;



    

    

    }



    return false;



}



int fun(int row,int col)

{

    int tem=0;

    for(int i=0;i<4;i++)

    {

        if(isvalid(row,col,x[i],y[i]))

        {

             int tfun=fun(row+x[i],col+y[i]);

             if(tem<tfun)

             {

              tem=tfun;

             }

        

        

        }

    

      

    }

    return tem+1;

    







}

//   ,        ,dp        

int fun2(int row,int col)

{

    if(dp[row][col]>0) return dp[row][col];

    int tem=0;

    for(int i=0;i<4;i++)

    {

        if(isvalid(row,col,x[i],y[i]))

        {

             int tfun=fun(row+x[i],col+y[i]);

             dp[row+x[i]][col+y[i]]=tfun;

             if(tem<tfun)

             {

              tem=tfun;

             }

        

        

        }

    

      

    }

    return tem+1;

    







}

int main()

{

    int len;

    cin>>len;

    while(len--)

    {

        memset(dp,0,sizeof(dp));

        

        cin>>r>>c;

        for(int i=0;i<r;i++)

        {

          for(int j=0;j<c;j++)

          {

              cin>>arr[i][j];

          

          }

        

        }

        int max=0;

    for(int i=0;i<r;i++)

        {

          for(int j=0;j<c;j++)

          {

            int tem= fun2(i,j); // i,j        

            if(max<tem) max=tem;

          

          }

        

        }

        

    cout<<max<<endl;

    

    }







    return 0;





}

좋은 웹페이지 즐겨찾기