注意每算一次之后不要重置dp数组,因为后面还可以用,不然的话会超时!!!!!
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int digit[30];
int len;
long long dp[30][15];
long long DFS( int pos, int pre, bool limit, bool pre_0 ){
if( pos == 0 ){
return 1;
}
if( !limit && dp[pos][pre] != -1 && !pre_0 ){
return dp[pos][pre];
}
int end = limit ? digit[pos] : 9;
long long sum = 0;
for( int i = 0; i <= end; i++ ){
if( !pre_0 && i - pre < 2 && i - pre > -2 ){
continue;
}
sum += DFS( pos - 1, i, limit && i == end, pre_0 && i == 0 );
}
if( !limit && !pre_0 ){
dp[pos][pre] = sum;
}
return sum;
}
long long solve( long long N ){
//memset( dp , -1, sizeof( dp ) );注意这里不能有这个 因为每次用过之后还可以再用。。。不然会超时!!!!!
len = 0;
while( N ){
digit[++len] = N % 10;
N /= 10;
}
return DFS( len, 11, true, true );
}
int main(){
long long A, B;
memset( dp , -1, sizeof( dp ) );
while( cin >> A >> B ){
long long ansA = solve( A - 1 );
long long ansB = solve( B );
cout << ansB - ansA << endl;
}
return 0;
}