0w1

CFR 204 A. Little Elephant and Interval ( Digit DP )

Problem - 204A - Codeforces
題意:
求 [ l, r ] 中,第一個位數等於最後一個位數的數字數量。
解法:
dp[ i ][ j ][ k ][ l ] : 考慮前 i 個位數,已嚴格小於對照數,第一個位數,最後一個位數,滿足這些條件的狀態數。
注意當 k == 0 的時候若要轉移,那麼該轉移數就是它的第一位數。

ll L, R;

void init(){
	cin >> L >> R;
}

void preprocess(){

}

ll get_pcnt( ll x, int inc ){ // returns number of the required values in range [ 1, x ) / ]
	vi s;
	while( x )
		s.emplace_back( x % 10 ),
		x /= 10;
	reverse( s.begin(), s.end() );
	vvvvl dp( s.size() + 1, vvvl( 2, vvl( 10, vl( 10 ) ) ) );
	dp[ 0 ][ 0 ][ 0 ][ 0 ] = 1;
	for( int i = 0; i < s.size(); ++i )
		for( int j = 0; j < 2; ++j )
			for( int k = 0; k < 10; ++k )
				for( int l = 0; l < 10; ++l )
					for( int d = 0; d <= ( j ? 9 : s[ i ] ); ++d ){
						if( k == 0 )
							dp[ i + 1 ][ j | d < s[ i ] ][ d ][ d ] += dp[ i ][ j ][ k ][ l ];
						else
							dp[ i + 1 ][ j | d < s[ i ] ][ k ][ d ] += dp[ i ][ j ][ k ][ l ];
					}
	ll res = 0;
	for( int j = 0; j < 2; ++j )
		for( int k = 1; k < 10; ++k ){
			if( not j and not inc )
				continue;
			res += dp[ ( int ) s.size() ][ j ][ k ][ k ];
		}
	return res;
}

void solve(){
	cout << get_pcnt( R, 1 ) - get_pcnt( L, 0 );
}