剑指 Offer II 097. 子序列的数目
可以将这个矩阵划出来,然后动态规划方程自然而然就显示了:
rabbitr100000a010000b001100b001200b000300i000030t000003\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
由上述可以看出,动态转移方程为:
ifs1[i]!=s2[j]:if{\kern 2pt}s1[i]!=s2[j]:ifs1[i]!=s2[j]:
dp[i][j]=dp[i−1][j−1]{\kern 20pt}dp[i][j]=dp[i-1][j-1]dp[i][j]=dp[i−1][j−1]
elses1[i]==s2[j]:else{\kern 2pt}s1[i]==s2[j]:elses1[i]==s2[j]:
dp[i][j]=dp[i−1][j]+dp[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的存在,每次遍历行时,另dp[i][0]=1dp[i][0]=1dp[i][0]=1,因此将dp的纬度加1。