C++ Coursera:自动签名器发出的未知信号11
我有一段关于最长公共子序列问题的代码(我用动态规划方法) 但Coursera自动加载器出现错误(失败案例#6/37:未知信号11(使用时间:0.00/1.00,使用内存:9166848/536870912)) #包括 使用名称空间std; 最大整数(整数a,整数b) { 返回a>b?a:b; } int公共子序列(向量&arr1,向量&arr2,int n,int m) { int ch[m+1][n+1]={0}; 对于(int i=0;i n; 向量arr1(n,0); 对于(int i=0;iC++ Coursera:自动签名器发出的未知信号11,c++,dynamic-programming,subsequence,C++,Dynamic Programming,Subsequence,我有一段关于最长公共子序列问题的代码(我用动态规划方法) 但Coursera自动加载器出现错误(失败案例#6/37:未知信号11(使用时间:0.00/1.00,使用内存:9166848/536870912)) #包括 使用名称空间std; 最大整数(整数a,整数b) { 返回a>b?a:b; } int公共子序列(向量&arr1,向量&arr2,int n,int m) { int ch[m+1][n+1]={0}; 对于(int i=0;i n; 向量arr1(n,0); 对于(int i=0
cout有两个问题可能导致未定义的行为
首先,您创建了一个大小为
ch[m+1][n+1]
的数组,但外部循环是for(i=0;i可能不是问题所在,而是可变长度数组,如int ch[m+1][n+1]={0};
不受标准C++支持未知信号11可能是分段错误。程序试图访问它不拥有的资源。请检查以确保所有数组访问都在边界内。vector
有一个执行边界检查的at
方法,可以帮助您解决此问题。无关:您的程序将编译如果只包含所需的头,则速度会快得多。#include
包含所有标准库头,这会非常昂贵。@StephanLechner提出的标准问题很容易导致堆栈溢出,堆栈溢出通常会导致分段错误。实际上,segfault是最好的堆栈溢出将为您做的事情,所以您应该感谢它。
#include <bits/stdc++.h>
using namespace std;
int max(int a,int b)
{
return a>b?a:b;
}
int common_sub_sequence(vector<int> &arr1, vector<int> &arr2, int n, int m)
{
int ch[m + 1][n + 1]={0};
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= m; j++)
{
if (i == 0 || j == 0)
{
ch[i][j] = 0;
}
else if (arr1[i - 1] == arr2[j - 1])
{
ch[i][j] = ch[i - 1][j - 1] + 1;
}
else
{
ch[i][j] = max(ch[i - 1][j], ch[i][j - 1]);
}
}
}
return ch[n][m];
}
int main()
{
int n=0, m=0;
cin>>n;
vector<int>arr1(n,0);
for (int i = 0; i < n; i++)
{
cin >> arr1[i];
}
cin >> m;
vector<int>arr2(m,0);
for (int j = 0; j < m; j++)
{
cin >> arr2[j];
}
cout << common_sub_sequence( arr1 , arr2, n, m) << "\n";
return 0;
}
int ch[n+1][m+1]`
std::vector<std::vector<int> > ch(n+1, std::vector<int>(m+1));