国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

最長不下降子序列問題

2019-11-08 02:55:47
字體:
來源:轉載
供稿:網友

DP

最大不下降子序列

前幾天看了關于動態規劃的內容,基本上講的都是最大不下降序列,所以第一次博客 就寫這個東西了。

最基本模板

給出一系列的數,給出一個整數,即最長不下降子序列(code vs 1567)

題解:

先另創一個數組,用來記錄某一個數到目前為止的最大長度,用for語句將所有元素遍歷 一遍就可以確定最長不下降子序列的長度了。 比如給出:21 22 63 15 從63開始(15不需要,其本身長度即為1),沒有元素比他大,故它的長度還是1,然后 是22,后面有一個元素比它大,所以其長度為1+1(本身長度)=2,對于21尋找比它大的且長度 最大的元素,即22(長度為2),故該元素長度為3。此時遍歷完畢,最大值為3。

下面上代碼:

#include<iostream>#include<stdio.h>using namespace std;int a[5000],dp[5000];int main(void){ int n,len=1; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; dp[i]=1; } for(int i=2;i<=n;i++) //其實從前從后遍歷都一樣 { for(int j=1;j<i;j++) { if(a[i]>a[j]) { dp[i]=max(dp[j]+1,dp[i]); } } len=max(len,dp[i]); } cout<<len<<endl;}

另解 可以另開一個堆棧數組stack[],每次取棧頂的元素stack[top]和讀到的元素temp 比較,如果temp>top,則將temp壓入棧頂,如果temp

#include<iostream>#include<stdio.h>#include<cstdlib>using namespace std;int main(void){int i,j,n,top,temp;int stack[1001];cin>>n;top=0;stack[0]=-1;for(i=0;i<n;i++){ cin>>temp; if(temp>stack[top]) { stack[top++]=temp; } else { int low=1,high=top; int mid; while(low<high) { mid=(low+high)/2; if(temp>stack[mid]) { low=mid+1; } else { high=mid-1; } } stack[mid]=temp; }}cout<<top<<endl; //話說我寫代碼都不喜歡寫return的。。。}

關于這個最長不下降子序列有一道題:攔截導彈(NOip1999) 題解: 這題第一問其實就是最長不上升子序列問題,之前有講,然后第二問其實就是問有 幾個最長不上升子序列,這個要用一個定理,書上寫的是:即一個序列中不上升 子序列的最小覆蓋數等于序列中最長上升序列的長度。(這什么鬼話,表示并沒有 看懂)其實說白了就是該問可以轉化為求最長不下降子序列的長度(至于為什么 ,因為前面那個沒有看懂的定理,反正用就好咯) 下面是代碼:

#include<iostream>#include<stdio.h>#include<cstdlib>#include<string.h>using namespace std;int dp[5000],a[5000];int main(void){int i,j,n=1,len=0,count=0;while(scanf("%d",&a[n])!=EOF) n++;for(i=1;i<n;i++){ dp[i]=1; for(j=1;j<=i;j++) { if(a[i]<a[j]&&dp[i]<dp[j]+1) dp[i]=dp[j]+1; if(dp[i]>len) len=dp[i]; }}memset(dp,0,sizeof(dp));for(i=1;i<=n;i++){ dp[i]=1; for(j=1;j<=i;j++) { if(a[i]>a[j]&&dp[i]<dp[j]+1) dp[i]=dp[j]+1; if(count<dp[i]) count=dp[i]; }}cout<<len<<'/n'<<count<<endl;}
上一篇:多線程

下一篇:GO實現 快速排序算法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肇东市| 巢湖市| 谢通门县| 兖州市| 阜康市| 南川市| 洮南市| 海城市| 太原市| 屯门区| 荆州市| 离岛区| 华坪县| 凤凰县| 利辛县| 上思县| 平塘县| 永宁县| 沛县| 合肥市| 龙海市| 白山市| 吉林市| 温宿县| 神木县| 新和县| 汽车| 石渠县| 宝丰县| 永宁县| 乌拉特后旗| 大荔县| 林口县| 紫阳县| 武威市| 航空| 成都市| 慈利县| 句容市| 长宁区| 玉门市|