gpt4 book ai didi

c++ - SPOJ 错误答案

转载 作者:行者123 更新时间:2023-11-30 04:26:36 28 4
gpt4 key购买 nike

我正在尝试关于 SPOJ 的问题,其中我们必须简单地找到 Longest Increasing Sub-sequence 的长度给定数组 A.

我使用动态规划 O(n^2) 算法解决了这个问题,解决方案被接受了。这是被接受的代码:

void LIS(int *A,int A_Length)
{
int Seq[MAX];
for(int i=0;i<A_Length;++i)
{
int maxima=0;
for(int j=0;j<i;++j)
{
if(A[i]>A[j])
{
maxima=max(Seq[j],maxima);
}
}
Seq[i]=maxima+1;
//cout<<Seq[i]<<endl;
}
cout<<*max_element(Seq,Seq+A_Length)<<endl;
}

但是当我尝试使用第二种方法(LINK)解决它时,它是::

A simple way of finding the longest increasing subsequence is
to use the Longest Common Subsequence (Dynamic Programming) algorithm.
[1]Make a sorted copy of the sequence A, denoted as B. O(nlog(n)) time.
[2]Use Longest Common Subsequence on with A and B. O(n2) time.

,我答错了。

这是我的c++代码

//Global Variable
int A[100],B[100];
int DP[100][100];

//This function Finds the Longest common subsequce of Array A[1,2,3...,N] and B[1,2,3...,N]
void LIS(int N)
{

sort((B+1),(B+1)+N);//STL SORT sort from index 1 to N of Array B.
int i,j;

//Base Cases
for(i=0;i<=N;++i)
DP[i][0]=0;

for(j=0;j<=N;++j)
DP[0][j]=0;

for(i=1;i<=N;++i)
{
for(j=1;j<=N;++j)
{
if(A[i]==B[j])
DP[i][j]=DP[i-1][j-1]+1;
else
DP[i][j]=max(DP[i-1][j],DP[i][j-1]);
}
}
printf("%d\n",DP[N][N]);
}
int main()
{
int N,i;
scanf("%d",&N);
for(i=1;i<=N;++i)
{
scanf("%d",&A[i]);
B[i]=A[i];
}
LIS(N);

return 0;
}

我不知道为什么我会得到错误的答案。你能帮我找到错误吗?或 site 中给出的 LCS 算法的 LIS不正确??

最佳答案

第二种方法是正确的,但不能直接应用于这个问题。那是因为序列中的数字在这个 SPOJ 问题中不能保证是唯一的,目标是找到一个严格递增子序列,而你的第二种方法的输出是非递减 子序列在这里。在一个简单的测试用例上进行演示 [1,2,2,3] 将帮助您找到不同之处。

这个解决方案也很简单:排序后删除重复的元素即可。

关于c++ - SPOJ 错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486868/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com