考虑一个动态规划问题,该问题询问序列 S 中有多少不同的子序列(不一定是连续的)具有值 p0 的特定属性 P。
P 的范围小且有限,有一种有效的 P 计算方法:
P(s1 + s2) = f(P(s1), P(s2))
其中+
表示序列连接。
一种方法是计算 S 的前缀有多少S[1] + S[2] + ... + S[k]
具有属性 px 的子序列。(将其存储在Count[px][k]
)
所以递归是:
Count[px][k] = Count[px][k-1] // not using element S[k];
P pq = f(px,P(S[k])); // calculate property pq of appending element S[k]
Count[pq][k] += Count[px][k-1] // add count of P(prefix+S[k])
答案是:
return Count[p0][S.length]
这在 S 的元素成对不同时有效,但是它将计算两次具有相同值但使用不同位置的不同元素的子序列。
我怎样才能修改这个算法,使它只计算相等的子序列一次?(即只计算不同的子序列)