392.判断子序列
dp[i][j]数组代表的含义为:以i-1为结尾的字符串s,和以j-1为字符串结尾的t,含有的子序列长度
当s[i-1]和t[i-1]相同时,子序列长度加一
当s[i - 1] != t[j - 1],此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];
(这里不用考虑dp[i-1][j]的原因是s短而t长,我们是用t中的字母去匹配s,当t中的字母无法匹配时,我们将t中的字母再往后推一格)
115.不同的子序列
dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。
这题t短s长,所以还是用s去匹配t
for(int i=1;i<=s.size();i++)
{
for(int j=1;j<=t.size();j++)
{
if(s[i-1]==t[j-1])
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
else
dp[i][j]=dp[i-1][j];
}
}
首先是递推公式,if(s[i-1]==t[j-1]),dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
每一次出现有字母相同的情况,不仅要继承之前的已经有的子序列的个数(dp[i-1][j]),还有新产生的子序列个数(dp[i-1][j-1]),这里dp[i-1][j-1]和dp[i][j]数量是完全相同的,只是子序列更长了
(baa,aa->baaa,aaa)
如果没有字母相同的情况,只需要继承之前有的子序列个数就行(dp[i-1][j])
这题初始化需要考虑到之后推导的结果合理化,所以可以举实例进行尝试