Будем последовательно решать задачу для первых i символов кода, основываясь на ответах для i - 1 и i - 2. Заметим, что если i-й символ кода равен 0 или ответа для i - 1 не существует, то ответ для i получается добавлением одного символа к ответу для i - 2, если последние две цифры кода нельзя понять, как зашифрованную букву, или ответа для i - 2 не существует, то надо добавить символ к i - 1, а иначе сравнить длины ответов и добавить букву к тому, кто короче.
Код (python 3.5): codes = "." with open('input.txt', 'r') as f: encoded = list(map(int,list(f.read( if len(encoded) == 1: print(codes[encoded[0]]) else: decoded = [codes[encoded[0]], ""] for i in range(1, len(encoded)): if (decoded[0] is None) or (encoded[i] == 0): decoded = [decoded[1] + codes[10*encoded[i-1] + encoded[i]], decoded[0]] elif (10*encoded[i-1] + encoded[i]>26) or (decoded[1] is None) or \ (len(decoded[1]) >= len(decoded[0])): decoded = [decoded[0] + codes[encoded[i]], decoded[0]] else: decoded = [decoded[1] + codes[10*encoded[i-1] + encoded[i]], decoded[0]] with open('output.txt', 'w') as f: f.write(decoded[0])
Var v:array [0..100000] of integer; a:array [0..100,0..100000] of integer; m,p,k,w:integer; procedure step(z,ma:integer);beginif z>0 then if a[z,ma]<>a[z-1,ma] then if a[z-1,ma]<a[z-1,ma-v[z]]+v[z] then begin step(z-1,ma-v[z]); write(v[z],' '); end else step(z-1,ma) else step(z-1,ma); end;
beginread(k);for p:=1 to k do begin read(v[p]); end;read(w);for p:=1 to k do begin for m:=1 to w do begin if m-v[p]>=0 then a[p,m]:=(max(a[p-1,m-v[p]]+v[p],a[p-1,m])) else a[p,m]:=a[p-1,m]; end; end;if a[k,w]=w then step(k,w) else writeln('No solution');end.
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota
Оформи подписку