1)第一行输入字符串 A, 第二行输入字符串 B
数据规模:len(B)2)计算在 A 的中子序列 B 出现的次数
样例:输入abcacca ac 输出:5
很明显的动态规划问题,,,可是这个数据规模a和b小于20万,数组开这么大的实属扯,所以求大佬们想想怎么解决。。。
我的代码:
using namespace std;
static int dp200000;
int numDistinct(string S, string T)
{
if (S.empty() || T.empty()) return 0;
if (S.length()<T.length()) return 0;
dp[0][0] = 1;
for (int i = 1; i <= T.length(); i++) {
dp[i][0] = 0;
}
for (int j = 1; j <= S.length(); j++) {
dp[0][j] = 1;
}
for (int i = 1; i <= T.length(); i++) {
for (int j = 1; j <= S.length(); j++) {
dp[i][j] = dp[i][j - 1];
if (T[i - 1] == S[j - 1])
dp[i][j] += dp[i - 1][j - 1];
}
}
return dp[T.length()][S.length()];
}
int main(void)
{
string S, T;
cin >> S >> T;
cout << numDistinct(S, T) << endl;
return 0;
}
acm平台提示运行错误(数组越界)
利用“滚动数组”来做,其实有更利于理解的做法。 你会发现,对于ai来说,ansbj会从ansb(j-1)进行一轮继承,所以在每个i上,new一个新的数组,进行继承,然后free掉之前的数组就可以了 不同于滚动数组,这个方法其实只是将一开始申请的超额内存动态申请
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。