意外と苦労した。
dp_table[桁数][動かした本数][他の桁へ移った本数]
class NumbersAndMatches {
public:
long long differentNumbers(long long N, int K) {
const string num[10][5] = {{"@#@",
"# #",
"@ @",
"# #",
"@#@"},
{" @",
" #",
" @",
" #",
"@#@"},
{"@#@",
" #",
"@#@",
"# ",
"@#@"},
{"@#@",
" #",
"@#@",
" #",
"@#@"},
{"@ @",
"# #",
"@#@",
" #",
" @"},
{"@#@",
"# ",
"@#@",
" #",
"@#@"},
{"@#@",
"# ",
"@#@",
"# #",
"@#@"},
{"@#@",
" #",
" #",
" #",
" @"},
{"@#@",
"# #",
"@#@",
"# #",
"@#@"},
{"@#@",
"# #",
"@#@",
" #",
"@#@"}};
const int M = 10;
int remove[M][M];
int add[M][M];
fill( &remove[0][0], &remove[M-1][M], 0 );
fill( &add[0][0], &add[M-1][M], 0 );
for(int i=0; i<M; ++i){
for(int j=0; j<M; ++j){
for(int k=0; k<5; ++k){
for(int l=0; l<3; ++l){
if( num[i][k][l] == ' ' && num[j][k][l] == '#' ) ++add[i][j];
if( num[i][k][l] == '#' && num[j][k][l] == ' ' ) ++remove[i][j];
}
}
}
}
string s;
ostringstream oss;
oss << N;
s = oss.str();
static lli t[21][131][260];
const int base = 130;
fill( &t[0][0][0], &t[21-1][130-1][260], 0 );
t[0][0][0 + base] = 1;
for(int i=0; i<s.size(); ++i){
for(int j=0; j<=K; ++j){
for(int k=0; k<260; ++k){
if( t[i][j][k] == 0 )continue;
for(int b=0; b<10; ++b){
int a = s[i] - '0';
int import = add[a][b] - remove[a][b];
int move = min( remove[a][b], add[a][b] ) + max( 0, import );
if( j + move < 131 && 0 <= k + import < 260 && k + import < 260 ){
t[i + 1][j + move][k + import] += t[i][j][k];
}
}
}
}
}
lli sum = 0;
for(int i=0; i<=K; ++i){
sum += t[s.size()][i][0 + base];
}
return sum;
}
};
0 件のコメント :
コメントを投稿