当前位置: 首页 > 知识库问答 >
问题:

关于SPOJ的错误答案

袁雅逸
2023-03-14

我试着在SPOJ上解决一个问题,我们必须简单地找到给定数组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;
}

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

共有1个答案

慕容铭
2023-03-14

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

这个解决方法也很简单:只需在排序后删除重复的元素。

 类似资料:
  • 下面是SPOJ的一个归档问题。示例测试用例通过了,但我在提交时得到了W/A。我缺少一些测试用例(testCase)。需要帮助来找出我错过了什么案例和/或我做错了什么。 瓢虫艾达正在和她的朋友维尼特玩除数游戏。这个游戏有以下规则。他们之间有一堆石头。移动中的玩家可以选择至少1块,最多σ(N)块石头(其中σ(N)代表N的除数)。显然,N在每次移动后都会发生变化。得不到任何石头(N==0)的人输了。 因

  • 链接到挑战 拉梅什和苏雷什每人在彩票上都会得到一个满满五颗星的盒子。由于两个盒子不需要相同数量的巧克力,他们决定玩游戏。获胜者可以同时拥有两盒巧克力。他们交替玩,苏雷什开始游戏。给定两个盒子中的巧克力数量,让它们成为c1和c2,玩家取c1或c2数量的巧克力,并将剩余的一盒巧克力分成两盒(这两个盒子不需要相同数量的巧克力)。不能做出这种举动的玩家输了。输入 输入的第一行包含一个数字 T(1 (1 输

  • 问题陈述: 有N个柜台,每个柜台有指定数量的鸡块 在任何柜台购买的每一块金块的成本与该时间点仍留在柜台的金块数量相同(包括购买的金块)。 Pre希望拥有M块最昂贵的金块。购买M块最昂贵的金块所需的总金额是多少。 有关更详细的问题说明,请参见此处。 这是我的JAVA代码: 它对简单的测试用例给出正确的答案,但在SPOJ上给出错误的答案。是我的逻辑有问题还是JAVA本身在SPOJ上产生了错误的答案?如

  • 这是我的代码。它正在传递问题语句中给出的测试用例。问题链接:http://www.spoj.com/problems/ACPC10D/tri[i][j]存储从tri[0][1]到达索引(i, j)的最小值。

  • 我尝试了以下代码,它与我尝试的自定义输入配合得很好,但是,它不被接受,并显示-WRONG ANSWER SPOJ-https://www.spoj.com/problems/ACPC10A/

  • 这是完整的代码, 这个问题是荒谬的。与问题相关的链接是:http://www.spoj.com/problems/ABSURD/.我不知道哪个测试用例失败了,我已经尝试了很多。基本上,我们必须减少尾随的零,并根据给定的规则计算荒谬性。然后我们必须确定在给定的范围内是否存在一个整数,其荒谬性小于给定数字的荒谬性。