lightOJ 1299 Fantasy Cricket

1735 단어 ant
제목 링크:http://lightoj.com/volume_showproblem.php?problem=1299
제목:문자열 S 는 UDE 세 글자 만 포함 되 어 있 습 니 다.문자열 길 이 를 n,S[1,n]으로 설정 합 니 다.n 의 전체 배열 중 몇 개가 다음 조건 을 만족 시 키 는 지 구 합 니 다(특정한 전체 배열 을 A[1,n]로 설정 합 니 다):S[A[i]를 U 로 설정 하면 A[i]i;S[A[i]를 E 로 하면 A[i]=i.다시 말 하면 원래 문자열 의 알파벳 D 는 모두 앞으로 이동 해 야 하고 U 는 모두 뒤로 이동 해 야 하 며 E 는 변 하지 않 는 다 는 것 이다.
사고방식:분명히 E 에 대해 우 리 는 직접 무시 하면 된다.f[i][j]를 설정 하면 앞 i 개의 위치 에 j 개의 자모 가 배치 되 지 않 은 위치 가 있다 는 것 을 나타 낸다.그러면:
(1)현재 알파벳 이 D 이면 f[i][j]=f[i-1][j]*j(앞에서 위 치 를 찾 아 이 D 를 내 려 놓 고),f[i][j-1]=f[i][j]*j*j(앞에서 놓 지 않 은 U 를 이 자리 에 놓 고 이 자리 D 를 내 려 놓 는 것);
(2)현재 알파벳 은 D,f[i][j+1]=f[i-1][j](놓 지 않 은 것 이 하나 더 생 겼 다),f[i][j]=f[i-1][j]*j(앞 에 놓 지 않 은 것 을 찾 아 여기에 놓 은 다음 이 위치의 U 를 놓 지 않 았 다).
 
char s[N];

i64 n,f[N][N];



void up(i64 &x,i64 y)

{

    x=(x+y%mod)%mod;

}





int cal()

{

    clr(f,0); f[0][0]=1;

    int i,j;

    FOR1(i,n)

    {

        if(s[i]=='D')

        {

            FOR0(j,i)

            {

                up(f[i][j],f[i-1][j]*j);

                if(j) up(f[i][j-1],f[i-1][j]*j*j);

            }

        }

        else

        {

            FOR0(j,i)

            {

                up(f[i][j+1],f[i-1][j]);

                up(f[i][j],f[i-1][j]*j);

            }

        }

    }

    return f[n][0];

}





int main()

{

    int num=0;

    rush()

    {

        RD(s+1);

        n=0;

        int i,L=strlen(s+1);

        FOR1(i,L) if(s[i]!='E') s[++n]=s[i];

        printf("Case %d: ",++num);

        PR(cal());

    }

}


 
 
 

좋은 웹페이지 즐겨찾기