ZOJ 2202

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 50000;

long dp[N];
char code[N];

//若是12,23这种可分解为1,2;3,4的形式的数则返回true;
//若是02,34这种只能分解一种形式的,则返回false。
bool isDevidable(char a,char b)
{
	if(a == '0' || b=='0' || a>'2' || (a=='2'&&b>'6') )
		return false;
	return true;
}

int main()
{
	int i=0,len;
	while(scanf("%s",code) != EOF && code[0] != '0')
	{
		len = strlen(code);
		dp[0] = 1;

		if(code[1] == '0' || !isDevidable(code[0],code[1]) )
			dp[1] = 1;
		else 
			dp[1] = 2;

		for(i=2; i<len; i++)
		{
			if(code[i] == '0')
			{
				dp[i] = dp[i-2];
			}
			else
			{
				bool flag = isDevidable(code[i-1],code[i]);
				if(flag)
					dp[i] = dp[i-1] + dp[i-2];
				else
					dp[i] = dp[i-1];
			}
		}

		printf("%d\n",dp[len-1]);
	}
	return 0;
}

  

posted @ 2012-11-25 19:23  Frank@609  Views(148)  Comments(0Edit  收藏  举报