TOJ 1541 알파코드 선형 DP(점진)

1292 단어 점차 미루다
제목도 암호화 해독과 관련된 것으로 아주 간단한'a'->1,'b'->2...''->26, 당신과 한 줄의 숫자를 요구한 다음에 몇 가지 복호화 방법을 보십시오. 같은 그룹의 숫자가 서로 다른 복호화에 대응할 수 있기 때문입니다. 예를 들어 25에는 두 가지가 있습니다. 25BE와 25Y.
우선 숫자에 0이 있을 수 있기 때문에 초기화할 때 두 개가 필요하다. dp[0]=dp[1]=1;
계속 고려할 때 현재 비트ch[i]가'0'이면 i-1비트와 두 자릿수(10, 또는 20)를 구성해야 한다. 문자가 0으로 암호화되지 않았기 때문이다.이때: dp[i] = dp[i-2];'0'이 아니라면 i, i-1 두 사람이 11-26 사이의 수를 구성할 수 있는지 고려해야 한다. 가능하다면 dp[i]=dp[i-1]+dp[i-2]
만약에 구성된 숫자가 26보다 크면 dp[i]=d[i-1], 즉 구성할 수 없다.만약에 구성된 숫자가 1-10 사이라면 i-1위가 0이라는 뜻이다. 이때 이 0은 반드시 i-2와 쌍이 되기 때문에 dp[i]는 여전히 dp[i-1]이다.지추 공식이 있으면 코드가 쉬워요. 주의하세요. 수조를 크게 만드는 게 좋아요. 제목 중에 약간 작아요. 500,,
코드:
#include <string.h>
#include<stdio.h>
long long dp[50000];
char ch[50000];
int main()
{
    while(scanf("%s",ch+1))// 1    
    {
        int len=strlen(ch+1);
        if(len==1&&ch[1]=='0') break;
        dp[0]=1;dp[1]=1;
        for(int i=2;i<=len;i++)
        {
            int t=(ch[i-1]-'0')*10+(ch[i]-'0');
            if(ch[i]=='0')dp[i]=dp[i-2];
            else if(t<=26&&t>10) dp[i]=dp[i-1]+dp[i-2];
            else dp[i]=dp[i-1];
        }
        printf("%lld
",dp[len]); } }

좋은 웹페이지 즐겨찾기