spoj 394

每段可以连续的串的可能性是个Fibonacci数列   但是直接dp更好吧~~

#include <cstdio>
#include <cstring>

using namespace std;

char a[5010];
int main()
{
    while(scanf("%s",a) && strcmp(a, "0"))
    {
        int len = strlen(a), cur = 1;
        int b = a[0] - '0';
        unsigned long long k = 1;
        for(int i = 1; i < len; i++)
        {
            if(a[i] == '0')
            {
                b *= 10;
            }
            else if(a[i] - '0' + b*10 <= 26)
            {
                if(a[i+1] != '0')
                    cur++;
                b = a[i] - '0';
            }
            else
            {
                unsigned long long d1 = 1, d2 = 2;
                if(cur >= 2)
                {
                    for(int j = 2; j < cur; j++)
                    {
                        d2 += d1;
                        d1 = d2 - d1;
                    }
                    k *= d2;
                }
                cur = 1;
                b = a[i] - '0';
            }
        }
        if(cur >= 2)
        {
            unsigned long long d1 = 1, d2 = 2;
            for(int j = 2; j < cur; j++)
            {
                d2 += d1;
                d1 = d2 - d1;
            }
            k *= d2;
        }
        printf("%llu\n",k);
    }
    return 0;
}

转一个DP的

#include <stdio.h>
#include <string.h>
#define LL long long
char s[5050];
LL d[5050];
int main()
{
    while(scanf("%s",s)==1)
    {
        int l=strlen(s);
        if(l==1&&s[0]=='0')break;
        memset(d,0,sizeof(d));
        d[0]=1;
        for(int i=1;i<=l;i++)
        {
            if(s[i-1]!='0')
            d[i]=d[i-1];
            if(i>1&&((s[i-2]=='1'&&s[i-1]>='0')||(s[i-2]=='2'&&s[i-1]<='6'&&s[i-1]>='0')))
            {
                d[i]+=d[i-2];
            }
        }
        printf("%lld\n",d[l]);
    }
    return 0;
}


posted @ 2013-08-09 12:26  xlc2845  阅读(117)  评论(0)    收藏  举报