C 查找具有最大总和的LIS
我有一个查找最长递增子序列(LIS)的代码,但当我测试代码时,我没有得到最大和,例如: 如果我输入2014310,答案是1310,但我需要1410 这是我的C代码: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
#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