剑指 Offer II 097. 子序列的数目
可以将这个矩阵划出来,然后动态规划方程自然而然就显示了:
r
a
b
b
i
t
r
1
0
0
0
0
0
a
0
1
0
0
0
0
b
0
0
1
1
0
0
b
0
0
1
2
0
0
b
0
0
0
3
0
0
i
0
0
0
0
3
0
t
0
0
0
0
0
3
\begin{matrix}{{}} {}&r&a&b&b&i&t\\ r&1&0&0&0&0&0\\ a&0&1&0&0&0&0\\ b&0&0&1&1&0&0\\ b&0&0&1&2&0&0\\ b&0&0&0&3&0&0\\ i&0&0&0&0&3&0\\ t&0&0&0&0&0&3 \end{matrix}
rabbbitr1000000a0100000b0011000b0012300i0000030t0000003
由上述可以看出,动态转移方程为:
i
f
s
1
[
i
]
!
=
s
2
[
j
]
:
if{\kern 2pt}s1[i]!=s2[j]:
ifs1[i]!=s2[j]:
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
−
1
]
{\kern 20pt}dp[i][j]=dp[i-1][j-1]
dp[i][j]=dp[i−1][j−1]
e
l
s
e
s
1
[
i
]
=
=
s
2
[
j
]
:
else{\kern 2pt}s1[i]==s2[j]:
elses1[i]==s2[j]:
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
]
+
d
p
[
i
−
1
]
[
j
−
1
]
{\kern 20pt}dp[i][j]=dp[i-1][j]+dp[i-1][j-1]
dp[i][j]=dp[i−1][j]+dp[i−1][j−1]
值得注意的是,为了保证1的存在,每次遍历行时,另 d p [ i ] [ 0 ] = 1 dp[i][0]=1 dp[i][0]=1,因此将dp的纬度加1。