CF914C коммивояжера и специальные номера

Название Описание

Для положительного целого числа х, мы определим число операций , что он должен стать двоичным «1», например , как мы знаем 1 . 3 1 0 = 1101 2  , 1101 и есть три «1», так что первичный 13 операция будет изменено на 3. Очевидно , что для положительного целого числа, мы провели несколько раз после операции, он, безусловно , станет одним.

Заданный п и к, где п задается в двоичной системе , а п не больше , чем все решил превратить его в минимальное количество операций для ряда значений к 10 ^ 7 + 9 результата по модулю.

1 < = п < 2 1 0 0 0 , 0  <= K <= 1000 0

решение проблемы

Так как в двоичной п максимальной длиной 1000, так что максимум 1000 1, время преобразования составляет не более 1000.

Мы можем обрабатывать текущее количество шагов также необходимо, чтобы х 1, CNT [I] = CNT [сумма [я]] + 1, сумма [I] для I-го числа в двоичной 1, суммы [I] = сумма [я ^ lowbit (я)] + 1, я ^ lowbit (я) является я крайним правым 1 удаляется в двоичной системе, это число должно первое дело, оно может быть рекурсивным, х 1000 или меньше.

Затем вы можете цифровой ДП, F [S] [число] [Пт] я представляет текущую позицию второго процесса, число от 1 до NUM

Затем конечный CNT [число] + 1 == к своего рода, Num перечисляется ряд преобразования полученного.

Shikakisaki 就 WA Рё ....

При рассмотрении к = 0, то на выходе будет 0, а 1 легко найти решение, потому что CNT работает один раз, и 1 не должны работать, поэтому специальный приговорена к = 0.

При к = 1, то ответ будет более чем в 2 раза, это происходит потому, что отношения между 0 и 1, так что [0] CNT установлен в отрицательной, то ответ Laid предложения к = -1 до 1.

 

# include <бит / STDC ++ ч.>
 с использованием  пространства имен STD; 

константный  ИНТ моды = 1000000007 ;
Const  INT maxn = 1005 ;
символ с [maxn];
INT к, длина, Num [maxn];
ИНТ сумма [maxn], CNT [maxn];
INT F [maxn] [maxn] [ 2 ]; 

недействительными инициализации () { 
    сумма [ 0 ] = 0 ; 
    CNT [ 1 ] = 0 ; 
    CNT [ 0 ] = - 2 ;
    для ( INT I = 1 ; я <=Тысяча ; я ++) , сумма [I] = сумма [я ^ (я & -i)] + 1 ;
    для ( INT I = 2 ; г <= 1000 ; я ++) CNT [I] = CNT [сумма [я]] + 1 ; 
} 

INT ДФС ( INT s, ИНТ с, BOOL Ит) {
     если (s!) Возвращение CNT [с] + 1 == к;
    если (е [s] [с] [Нт] = - 1 ) возвращение е [s] [с] [Нт];
    ИНТ х = Нт? Num [с]: 1 ;
    INT RET = 0 ;
    для (Int я = 0 ; я <= х; я ++ ) 
     RET = (RET + ДФС (втор- 1 , с + (я == 1 ), Lim && я == х))% по модулю;
    вернуться F [S] [C] [Пт] = RET; 
} 

INT сх () { 
    MemSet (е, - 1 , SizeOf (е));
    вернуться в глубину (LEN, 0 , правда ); 
} 

INT основных () { 
    инициализации (); 
    зсапЕ ( " % S% d " , с, & к);
    если (! к) {Е ( " 1 " ); вернуть 0 ;} 
    LEN = StrLen (ы);
    для ( INT I = 1 ; г <= Len; я ++) Num [I] = S [LEN-я] - ' 0 ' ;
    INT ANS = сх ();
    если (к == 1 ) ans-- ; 
    Е ( " % d " , ANS); 
}
Просмотр кода

 

То, что Интернет является числом комбинаций, очевидно, есть цифровая метка DP (не скрывать свои комбинации чисел)

 

рекомендация

отwww.cnblogs.com/sto324/p/11401958.html