最长递增子序列c语言代码,c语言求最长递增(减)子序列

本文介绍了如何使用C语言实现最长递增子序列(LIS)和最长递减子序列(LDS)的动态规划算法。代码中定义了比较函数并用最大值和最小值函数作为例子,通过动态规划计算出数组中的最长递增和递减子序列长度及序列本身。
摘要由CSDN通过智能技术生成

#include

#include

#include

#include

typedef short (*cmpfun)(int, int);

short max(int a, int b)

{

return a > b;

}

short min(int a, int b)

{

return a < b;

}

/*最长递增(减)子序列*/

int getdp(int *a, int n, cmpfun f, int *dp, int *s)

{

int **lis = malloc(n*sizeof(int *));

int cnt;

int ans = 1;

int m = 0;

int d;

int i, j;

memset(dp, 0x00, n*sizeof(int));

lis[0] = malloc(sizeof(int));

dp[0] = 1;

lis[0][0] = a[0];

for(i=1; i

{

cnt = 1;

for(j=0; j

{

if(f(a[i], a[j]))

{

if(dp[j]+1 > cnt)

{

cnt = dp[j]+1;

}

}

}

dp[i] = cnt;

}

for(i=1; i

{

lis[i] = malloc(dp[i]*sizeof(int));

if(dp[i] > ans)

{

m = i;

ans = dp[i];

}

}

for(i=0; i

{

cnt = 1;

d = -1;

for(j=0; j

{

if(f(a[i], a[j]))

{

if(dp[j]+1 > cnt)

{

cnt = dp[j]+1;

d = j;

}

}

}

if(d >= 0)

{

for(j=0; j

{

lis[i][j] = lis[d][j];

}

}

else

{

j = 0;

}

lis[i][j] = a[i];

}

for(i=0; i

{

s[i] = lis[m][i];

}

for(i=1; i

{

free(lis[i]);

lis[i] = NULL;

}

free(lis);

lis = NULL;

return ans;

}

int main()

{

int a[3000];

int b[3000];

int c[3000];

int d[3000];

int n = 0;

int s;

int m[4];

int i;

while(scanf("%d", &n) != EOF)

{

for(i=0; i

{

scanf("%d", a+i);

}

m[0] = getdp(a, n, max, b, c);

m[1] = getdp(a, n, min, b, d);

printf("%d\n", m[0]);

for(i=0; i

{

printf("%d ", c[i]);

}

printf("\n");

printf("%d\n", m[1]);

for(i=0; i

{

printf("%d ", d[i]);

}

printf("\n");

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值