[问题] ICPC 6015

楼主: lubrige (lubrige)   2013-03-16 18:16:51
题目: http://ppt.cc/Aogu
给予整数 N, R, Q,求一最大的正整数 M,使得
(1) 将 N 和 M 写成十进制表示时,M 是 N 的 subsequence
(2) M 除 Q 会余 R
其中 1 <= N < 10^1000, 0 <= R < Q <= 1000
目前的做法是
定义状态 f[i][j],表示从 N 的最高位开始,考虑过前 i 个数字是否选进 M,且
余 j 的情况时 M 的最大长度 (暂不考虑 value 大小),其中若为走不到的状态则填 -1。
转移为 (d(k) 为 k 从最高位下来第 k 个数字, zero base)
/ f[i - 1][j]
f[i][j] = max |
\ f[i - 1][j'] + 1, j = (10 * j' + d(i - 1)) % Q,
if f[i - 1][j'] != 0 or d(i - 1) != 0
boundary condition:
1. f[0][0] = 0
2. f[0][i] = -1, for 0 < i < Q
最大长度的表填完之后,再从 N 的最低位做回来,并且另外开一张表 g[i][j],
记到 f[i][j] 这格所形成的最长 subsequence,最高位数字是多少。
对于不是 -1 的格子,取下面里比较大的数字 (这部份用 buttom up 来说):
1. g[i + 1][j], if f[i + 1][j] == f[i][j]
2. d(i), if f[i + 1][j'] == f[i][j] + 1, j' = (10 * j + d(i)) % Q
另外因为这部份倒过来做,所以为了避免抓到不是从 f[length(N)][R] 填回来的数字,
上面的计算还考虑是不是从 f[length(N)][R] 填回来的,如果不是的话一样不考虑
g[i + 1][j] 或 d(i),这部份再记一张来解决。
不过答案不对,想请问一下有没有什么没有考虑到地方,先谢谢大家 0w0/
作者: seanwu (海恩)   2013-03-17 17:16:00
我照你的做法AC了,注意填 g[i][j] 时,如果两个case都可以要选 2.,意思是一样的数字选高位的优先可能会错的测资: 881 4 7,答案是 88,选错会变成 81
作者: bleed1979 (十三)   2013-03-23 17:32:00
请问有没有刁钻的测资啊,一直WA。

Links booklink

Contact Us: admin [ a t ] ucptt.com