nlogn演算法精髓在於設立陣列dp[ ],dp[i]表示長度為i的不下降序列中結尾元素的最小值,用len表示陣列目前的長度,演算法完成後len的值即為最長不下降子串行的長度。
設當前的以求出的長度為len,則判斷num[i]和dp[len]:
1.如果num[i]>dp[len],即num[i]大於長度為len的序列中的最後乙個元素,這樣就可以使序列的長度增加1,即len++,然後現在的dp[len]=num[i];
2.如果num[i]num[i],然後因為dp[j]
例如:num[ ]=
到num[2]=6,dp[3]=6應該沒什麼問題,
i=3,num[3]=4,3
i=5,num[4]>dp[3], len++,len=4,dp[len]=num[4],得到序列長度len=4.
**:(嚴格遞增)
#include#includeint binsearch(int key,int* dp,int left,int right)
else right=mid-1;
} return 0;
}int main()
else
dp[j]=a[i];
} printf("%d\n",len);
}}
最長不降子串行 動態規劃
2008 4 8 最長不降子串行 小明晚上回家後,和爸爸玩這樣的乙個遊戲 給出n個 0一 動態規劃演算法 本題是比較簡單的動態規劃,請理解好遞推的過程。具體方法是對於陣列a,另設一陣列b,將b陣列內元素全置1,表示最短子串行長度為1。從陣列a左到右乙個個判斷,每判斷乙個,則從這個元素向右尋找,找到比...
動態規劃之最長不降序子串行
用乙個陣列dp記錄以該元素開始的所對應最長不下降子串行的長度。初始化dp 經過迴圈執行後形成下表 程式如下 最長不下降子串行 include using namespace std int dp 105 int lis int a,int n else continue 防止倒數第二個元素dp自加1...
求最長不降子串行(動態規劃)
求最長不下降子串行 動態規劃 狀態轉移方程 length i 1 length j j為data i data j 的情況下能使length j 取到最大的值 初始情況length 1 1 且length 0 0,這樣求出來的length j 才可以取到0 include int data 15 下...