c语言找出递增子数组的长度,求给定数组的最长递增子序列(记录子序列的值)...

#include using namespace std;

const int maxn = 100;

int arr[maxn], dp[maxn], pre[maxn]; // pre记录前一个的下标

int maxL = 1, idx = 0;

// 根据pre[]递归输出最长递增子序列

int cntOutput = 0;

void printTraverse(int idx)

{

if(idx == -1)

return;

else

{

printTraverse(pre[idx]);

printf("%d", arr[idx]);

cntOutput++;

if(cntOutput < maxL)

printf("-");

}

}

int main()

{

int n;

scanf("%d", &n);

for(int i = 0; i < n; i++)

{

scanf("%d", &arr[i]);

}

// dp

memset(pre, -1, sizeof(pre)); // 初始化很重要

// int maxL = 1, idx = 0;

for(int i = 0; i < n; i++)

{

dp[i] = 1;

for(int j = 0; j < i; j++)

{

// arr[i] >= arr[j],不降. dp[j] + 1 >= dp[i] 找后面的

if(arr[i] >= arr[j] && dp[j] + 1 >= dp[i])

{

dp[i] = dp[j] + 1;

pre[i] = j;

}

}

if(dp[i] >= maxL) // >= 找靠后的

{

maxL = dp[i];

idx = i;

}

// printf("dp[%d]=%d\n", i, dp[i]);

}

// output

printf("%d\n", maxL);

/*

while(idx != -1)

{

printf("%d", arr[idx]);

maxL--;

if(maxL > 0)

printf(" ");

idx = pre[idx];

}

*/

printTraverse(idx);

}

/*

9

10 22 9 33 21 50 41 60 80

10 22 33 41 60 80 // 另解 10 22 33 50 60 80 ?

6

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值