codeforces B. Cow Program(기억형 검색)

제목 링크:


codeforces 283B

제목 대의:


n개의 수를 주고 홀수 번의 조작 x, y는 모두 a[x]를 더하고 짝수 번의 조작 y는 a[x]를 더하고 x는 a[x]를 빼고 범위를 벗어나면 끝난다.끝날 때의 y값을 묻습니다. 끝낼 수 없으면 출력-1

제목 분석:

  • 기록 상태 dp[x][2]는 홀수 번 또는 짝수 번 x점에 도착했을 때 걷고 나면 얻을 수 있는 권한값이다.
  • 직접 검색, 검색한 상태를 직접 되돌려줍니다.

  • AC 코드:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #define MAX 200007
    
    using namespace std;
    
    typedef long long LL;
    
    LL dp[MAX][2];
    int vis[MAX][2];
    int a[MAX],n;
    
    void dfs ( int x , int d )
    {
        if ( vis[x][d%2] ) return;
        vis[x][d%2] = 1;
        if ( d&1 )
        {
            int y = x-a[x];
            if ( y <= 0 ) 
            {
                dp[x][d%2] = a[x];
                return;
            }
            dfs ( y , d+1 );
            if ( dp[y][(d+1)%2] != -1 ) 
                dp[x][d%2] = dp[y][(d+1)%2] + a[x];
        }
        else
        {
            int y = x+a[x];
            if ( y > n ) 
            {
                dp[x][d%2] = a[x];
                return;
            }
            dfs ( y , d+1 );
            if ( dp[y][(d+1)%2] != -1 )
                dp[x][d%2] = dp[y][(d+1)%2] + a[x];
        }
    }
    
    int main ( )
    {
        while ( ~scanf ( "%d" , &n ) )
        {
            for ( int i = 2 ; i <= n ; i++ )
                scanf ( "%d" , &a[i] );
            memset ( vis , 0 , sizeof ( vis ) );
            memset ( dp , -1, sizeof ( dp ) );
            dp[1][0] = -1;
            vis[1][0] = 1;
            dp[1][1] = 0;
            vis[1][1] = 1;
            for ( int i = 2 ; i <= n ; i++ )
                dfs ( i , 1 );
            for ( int i = 2 ; i <= n ; i++ )
                if ( dp[i][1] != -1 )
                    dp[i][1] += i-1;
            for ( int i = 2 ; i <= n ; i++ )
                printf ( "%lld
    "
    , dp[i][1] ); } }

    좋은 웹페이지 즐겨찾기