版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiki_tangmingwei/article/details/83244927
一、题目描述
【题1】求一个数组的最长非连续递减子序列
【题2】求一个数组的最长连续递减子序列
二、解题思路
【题1】采用动态规划的思想,设dp[i]为以i为终点元素的递减子序列长度,则递推公式为:
dp[i] = max(dp[j]+1,dp[i]) (j<i && array[j]>array[i])
【题2】用两个游标start和end分别记录连续递减子序列的首和尾,一旦遇到递增的情况则更新start和end的值。用max_len记录当前最长的连续递减子序列长度
三、解题算法
【题1】最长非连续递减子序列--动态规划
/**************************************
author:tmw
date:2018-10-21
**************************************/
#include <stdio.h>
#include <stdlib.h>
#define max(a,b) (a>b?a:b)
/**
* @param int* array 题给数组
* @param int array_len 数组长度
**/
int findMaxUncontinuesSubArray(int* array, int len)
{
int* dp = (int*)malloc(len*sizeof(int));
int i,j;
for(i=0; i<len; i++)
{
dp[i] = 1; //dp数组初始化
for(j=0; j<i; j++)
{
if(array[j]>array[i])
dp[i] = max(dp[j]+1, dp[i]);//把array[j]纳入以i为终点元素的序列中
}
}
//寻找以i为终点元素的最长非连续递减子序列
int max_len = dp[0];
for(i=1; i<len; i++)
{
if(max_len<dp[i])
max_len = dp[i];
}
return max_len;
}
【题2】最长连续递减子序列
/**************************************
author:tmw
date:2018-10-21
**************************************/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define max(a,b) (a>b?a:b)
int findMaxContinueSubArray(int* array, int len)
{
if(array==NULL || len<0) return -1;
int start = 0;
int end = 1;
int max_len = INT_MIN;
while(start<end && end<len)
{
while(array[end-1]>array[end] && end<len)
{
if(max_len<end-start+1)
{
printf("[%d-%d]\n",start,end);
max_len = end-start+1;
printf("%d\n",max_len);
}
end++;
}
if(array[end-1]<array[end])
{
start = end;
end++;
}
}
return max_len;
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~