最長非連續/連續遞減子序列
阿新 • • 發佈:2019-02-07
一、題目描述
【題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; }
夢想還是要有的,萬一實現了呢~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~