[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;
}

 

posted @ 2015-04-23 22:43  哈特13  阅读(355)  评论(1编辑  收藏  举报