DIAMONDPATH 시간초과 뜨는데 어떻게 해야할지 모르겠어요.

  • User Avatar
    박태우

    ##코드
    ~~~ c++
    #include
    using namespace std;

    int final=0;
    int n;

    void search(int **arr,int f,int s,int count,int sum)
    {
    sum+=arr[f][s];

    if(f==2*n-2) //마지막 숫자에 도달했을 때
    {
        if(final < sum)final = sum; 
        return;
    }
    
    if(f<n-1)
    {
        search(arr,f+1,s,count,sum);
        search(arr,f+1,s+1,count,sum);
    }
    else // 역삼각형 모양일때
    {
        if(s==0) search(arr,f+1,s,count,sum);
        else if(s==f-(2*count))
        {
            search(arr,f+1,f+1-(2*(count+1)),count+1,sum);
        }
        else
        {
            search(arr,f+1,s-1,count+1,sum);
            search(arr,f+1,s,count+1,sum);
        }
    }
    

    }

    int main()
    {
    int cases=0;
    cin >> cases;
    for(int i=0; i<cases; i++)
    {
    int count=1;
    final=0;

        cin >> n;
    
        int **arr= new int*[2*n-1];
    
        for(int j=0; j<2*n-1; j++) //다이아몬드 입력
        {
            if(j<n)
            {
                arr[j] = new int[j+1];
                for(int k=0; k<j+1; k++)
                {
                    cin>>arr[j][k];
                }
            }
            else
            {
                arr[j] = new int[j-(2*count-1)];
                for(int k=0; k<j-(2*count-1); k++)
                {
                    cin>>arr[j][k];
                }
                count++;
            }
        }
    
        search(arr,0,0,0,0);
    
        cout<<final<<endl;
    
    }
    

    }
    ~~~

    다이아몬드에서 하나의 숫자를 들어갈 때마다 재귀함수를 호출하도록 코드를 짰는데요

    시간초과가 뜨네요ㅜㅜ


    10년 전
1개의 댓글이 있습니다.
  • User Avatar
    jseo

    이 경우에 완전탐색은 지수시간이 걸리기 때문에 제한시간안에 들어올수 없습니다. 동적계획법 + 메모이제이션에 대해서 공부해보세요.


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.