C 查找具有最大总和的LIS

C 查找具有最大总和的LIS,c,algorithm,lis,C,Algorithm,Lis,我有一个查找最长递增子序列(LIS)的代码,但当我测试代码时,我没有得到最大和,例如: 如果我输入2014310,答案是1310,但我需要1410 这是我的C代码: #include <stdio.h> #include <stdlib.h> #define INT_INF 1000 int search_replace(int *lis, int left, int right, int key) { int mid; for (mid = (le

我有一个查找最长递增子序列(LIS)的代码,但当我测试代码时,我没有得到最大和,例如:

如果我输入2014310,答案是1310,但我需要1410 这是我的C代码:

#include <stdio.h>
#include <stdlib.h>

#define INT_INF 1000

int search_replace(int *lis, int left, int right, int key) {
    int mid;

    for (mid = (left+right)/2; left <= right; mid = (left+right)/2) {
            if (lis[mid] > key) {
                    right = mid - 1;
            } else if (lis[mid] == key) {
                    return mid;
            } else if (mid+1 <= right && lis[mid+1] >= key) {
                    lis[mid+1] = key;
                    return mid+1;
            } else {
                    left = mid + 1;
            }
    }
    if (mid == left) {
            lis[mid] = key;
            return mid;
    }
    lis[mid+1] = key;
    return mid+1;
}

int main() {
    int size, i;

    scanf(" %d", &size);

    int A[size];

    for(i = 0; i < size; i++){
        scanf(" %d", &A[i]);
    }

    int tmp, lis_length = -1;
    int *answer;
    int LIS[size];
    int index[size];

    LIS[0] = A[0];
    for (i = 1; i < size; ++i) {
            LIS[i] = INT_INF;
    }

    for (i = 1; i < size; ++i) {
            index[i] = search_replace(LIS, 0, i, A[i]);
            if (lis_length < index[i]) {
                    lis_length = index[i];
            }
    }

    answer = (int*) malloc((lis_length+1) * sizeof(int));
    for (i = size-1, tmp = lis_length; i >= 0; --i) {
            if (index[i] == tmp) {
                    answer[tmp] = A[i];
                    --tmp;
            }
    }

    printf("LIS: ");
    for (i = 0; i < lis_length+1; ++i) {
            printf("%d ", answer[i]);
    }
    printf("\n");

    return 0;
}
#包括
#包括
#定义INT\u INF 1000
整数搜索\替换(整数*lis、整数左、整数右、整数键){
int mid;
用于(中间=(左+右)/2;左键){
右=中-1;
}else if(lis[mid]==键){
中途返回;
}否则如果(mid+1=键){
lis[mid+1]=键;
返回mid+1;
}否则{
左=中+1;
}
}
如果(中间==左){
lis[mid]=键;
中途返回;
}
lis[mid+1]=键;
返回mid+1;
}
int main(){
int大小,i;
scanf(“%d”,大小(&S);
int A[大小];
对于(i=0;i=0;--i){
if(索引[i]==tmp){
答案[tmp]=A[i];
--tmp;
}
}
printf(“LIS:”);
对于(i=0;i
第一个输入是数组中的元素数


我尝试了这篇文章:,其他的很少,但没有成功。

我分析了你的代码,发现了你的问题:你没有找到最大和的lis的代码,你只有简单的lis搜索。我已经添加了缺少的部分,现在,代码正常工作。此外,我还编写了自己的解决方案,使用另一种lis搜索算法,不使用二进制搜索

注意:查找中间值的
(左+右)/2
方法存在问题-

您的代码与我的添加: 输出

0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15
The longest increasing sequence number is:
6

The longest increasing sequence with the max sum is: 
0 4 6 9 13 15 
0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15
The longest increasing sequence number is:
6

The longest increasing sequence with the max sum is: 
0 4 6 9 13 15