题目:现在给你一字符串(含字母A~Z对应1~26),求它可以被翻译为几种不同的字符串。
分析:dp,大整数。类似Fib的递推关系。
如果,当前的串表示小于27的数字,既可以表示成两个,否则就是一种。
注意:一定要注意 0 只能和前面的组成一个。(2011-09-19 01:35)
#include <stdio.h>
#include <string.h>
using namespace std;
int F[ 10005 ][ 200 ];
char C[ 10005 ];
int number( char a, char b )
{
return 10*(a-'0')+b-'0';
}
int main()
{
while ( scanf("%s",&C[ 1 ]) && C[ 1 ] != '0' ) {
memset( F, 0, sizeof( F ) );
F[ 0 ][ 0 ] = 1;F[ 1 ][ 0 ] = 1;
int L = strlen( &C[ 1 ] );
for ( int i = 2 ; i <= L ; ++ i ) {
if ( C[ i ] != '0' )
for ( int k = 0 ; k <= 150 ; ++ k )
F[ i ][ k ] = F[ i-1 ][ k ];
if ( C[ i-1 ] != '0' && number( C[ i-1 ], C[ i ] ) <= 26 )
for ( int k = 0 ; k <= 150 ; ++ k ) {
F[ i ][ k ] += F[ i-2 ][ k ];
if ( F[ i ][ k ] >= 10 ) {
F[ i ][ k+1 ] += F[ i ][ k ]/10;
F[ i ][ k ] %= 10;
}
}
}
int start = 150;
while ( !F[ L ][ start ] ) -- start;
while ( start >= 0 )
printf("%d",F[ L ][ start -- ]);
printf("\n");
}
return 0;
}