[POJ 1850] Code

Code
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 8539   Accepted: 4048

Description

Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered that the words are made only of small characters of the English alphabet a,b,c, ..., z (26 characters). From all these words we consider only those whose letters are in lexigraphical order (each character is smaller than the next character).  
The coding system works like this:  • The words are arranged in the increasing order of their length.  • The words with the same length are arranged in lexicographical order (the order from the dictionary).  • We codify these words by their numbering, starting with a, as follows:  a - 1  b - 2  ...  z - 26  ab - 27  ...  az - 51  bc - 52  ...  vwxyz - 83681  ... 
Specify for a given word if it can be codified according to this coding system. For the affirmative case specify its code. 

Input

The only line contains a word. There are some constraints:   • The word is maximum 10 letters length  • The English alphabet has 26 characters. 

Output

The output will contain the code of the given word, or 0 if the word can not be codified.

Sample Input

bf

Sample Output

55

Source

Romania OI 2002
 
数位DP、简单、不过写了好久,囧
#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

#define ll long long

#define N 110



char s[N];

ll bit[N];

ll dp[N][N];



ll dfs(ll pos,ll mx,bool limit,bool fzero)

{

    if(pos==-1) return 1;

    if(!limit && !fzero && dp[pos][mx]!=-1) return dp[pos][mx];

    ll end=limit?bit[pos]:26;

    ll ans=0;

    for(ll i=fzero?0:mx; i<=end; i++)

    {

        ans+=dfs(pos-1,i+1,limit && i==end,fzero && !i);

    }

    if(!limit && !fzero) dp[pos][mx]=ans;

    return ans;

}

ll cal()

{

    ll len=strlen(s+1);

    for(ll i=1; i<=len; i++)

    {

        bit[len-i]=s[i]-'a'+1;

    }

    return dfs(len-1,0,1,1);

}

int main()

{

    memset(dp,-1,sizeof(dp));

    while(scanf("%s",s+1)!=EOF)

    {

        int flag=1;

        int len=strlen(s+1);

        for(int i=1; i<len; i++)

        {

            if(!(s[i]<s[i+1]))

            {

                flag=0;

                break;

            }

        }

        if(!flag) printf("0\n");

        else

            printf("%lld\n",cal()-1);

    }

    return 0;

}

 

你可能感兴趣的:(code)