1. 程式人生 > >最長遞增子序列之我的第一個動態規劃

最長遞增子序列之我的第一個動態規劃

求(嚴格)最長遞增子序列

我在仔細參考了知乎作者王勐,徐凱強Andy的文章(http://www.zhihu.com/question/23995189/answer/35429905)之後,冒著大無畏的探索精神,成功寫出人生中的第一個動態規劃(中間沒有看其他任何程式碼喔!),歐耶!此刻我的心情萬分激動,體內的多巴胺在急劇分泌。。。

完整程式碼如下:

//最長遞增子序列,動態規劃,陣列下標從1開始
#include<iostream>
using namespace std;
int main(){

int n;
cin>>n;
cout<<endl;

int *p=new int[n+1]; //輸入的原始資料,第一個資料為p[1]
p[0]=0;
for(int i=1;i<=n;i++){
cin>>p[i];
}


//演算法核心
int *len=new int[n];

len[0]=0;
len[1]=1;
int k=1;
int book[50][50]={0};
book[1][1]=p[1];


for(int i=2;i<=n;i++){



int add=0;
int au=k;
for(int j=1;j<=k;j++){ //k為遞增子序列的段數,book[i][]儲存遞增子序列的元素,len[i]儲存遞增子序列的長度


if(p[i]>book[j][len[j]]){ //大於最大值
len[j]=len[j]+1;
book[j][len[j]]=p[i];
continue;


}
else if(p[i]<book[j][1]) add++;
else if(p[i]<book[j][len[j]]){ // 介於頭和尾之間 ,建立新的子序列

k++;

int t=1;
while(p[i]>book[j][t]){

book[k][t]=book[j][t];

t++;


}
book[k][t]=p[i];
len[k]=t;

continue;

}





}
if(add==au){


k++;
book[k][1]=p[i];
len[k]=1;

}


}

//輸出最長子序列
int max=len[1];
int mark=1;
int best[10]={0}; //假設相同最長子序列段數小於10
int num=1; //表示最長子序列的段數
for(int j=1;j<k;j++){ //尋找len[]中的最大值

if(max<len[j+1]){
max=len[j+1];
mark=j+1;



}


}
//找出相同的最長子序列
best[1]=mark;
for(int j=1;j<=k;j++){
if((max==len[j])&&(mark!=j)){

num++;
best[num]=j;




}


}



int position=best[1];
for(int j=1;j<=num;j++){


position=best[j];
for(int i=1;i<=len[position];i++)
{
cout<<book[position][i]<<" ";
}

cout<<endl;


}

delete p;
delete len;

return 0;


}



(額。。。統計結果的時候可能多餘了,這無關緊要!)

相關推薦

遞增序列第一動態規劃

求(嚴格)最長遞增子序列 我在仔細參考了知乎作者王勐,徐凱強Andy的文章(http://www.zhihu.com/question/23995189/answer/35429905)之後,冒著大無

公共序列(Java實現)——動態規劃

【問題描述】 給定2個序列X和Y,當另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。 給定2個序列X={A,B,C,B,D}和Y={B,D,C,A,B},找出X和Y的最長公共子序列{B,C,B}。 【分析】最長公共子序列問題具有最優子結構性質 設 X = {

硬幣找零,上升序列,揹包問題等動態規劃問題詳解

1.硬幣找零 如果我們有面值為 1 元、3 元和 5 元的硬幣若干枚,如何用最少的硬幣湊夠 11 元? 首先我們思考一個問題,如何用最少的硬幣湊夠 i 元(i<11)?為什麼要這麼問呢? 兩個原因:1.當我們遇到一個大問題時,總是習慣把問題的規模變小,這樣便於分析討論。 2.這

算法總結 遞增序列

時間 返回 依次 算法總結 實現 最長 一個 遞增 總結 給定一個數組arr,返回arr最長遞增子序列 要求 如果長度為N 請實現時間復雜度為O(N logN)的方法 動態規劃解題思路: 1 生成長度為N的數組dp, dp[i]表示在以arr[i]這個數結尾的情況下

動態規劃遞增序列(LIS)

lib sca while -c -o 組成 describe log ret 在一個已知的序列{ a1,a2,……am}中,取出若幹數組成新的序列{ ai1, ai2,…… aim},其中下標 i1,i2, ……im保持遞增,即新數列中的各個數之間依舊保持原

動態規劃遞增序列(Longest Increasing Subsequence)

We have discussed Overlapping Subproblems and Optimal Substructure properties in Set 1 and Set 2respectively. 我們已經在前討論了重疊的子問題與最優的子結構屬

大子陣列之和、大子陣列積、遞增序列求法

#include<iostream> #include<math.h> using namespace std; int max(int a,int b){ return a>b?a:b; } int FindGreatestSumOfSubArrey(int

遞增序列程式設計美232演算法

#include <stdio.h> #include <stdlib.h> int a[100];//儲存原始序列 int LIS[100];//儲存以a[i]為最大元素的最長遞增子序列的長度 int MaxV[100];//儲存長度為i的遞增子序

動態規劃遞增序列 不重複公共序列

【前言】動態規劃:與分治法相似,即通過組合子問題來求解原問題,不同的是分治法是將問題劃分為互不相交的子問題,遞迴求解子問題,再將他們組合起來求出原問題的解。 動態規劃則應用於子問題重疊的情況,通常用來求解最優化問題。這類問題可以有很多可行解,每個解都有一個值,我們希望尋找最

動態規劃合唱隊形問題(遞增序列變形)

題目描述 N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學不交換位置就能排成合唱隊形。 合唱隊形定義:設K位同學從左到右依次編號為1, 2, …, K,他們的身高分別為T1, T2, …, TK, 則他們的身高滿足T1 <

leetcode遞增序列問題

wan details img mat 最後一個元素 例如 公式 back 一個 題目描寫敘述: 給定一個數組,刪除最少的元素,保證剩下的元素是遞增有序的。 分析: 題目的意思是刪除最少的元素。保證剩下的元素是遞增有序的,事實上換一種方式想,就是尋找最長的遞增有序序列。

[網絡流24題]遞增序列問題 大流

size 個數 clu 編程 input num pac ros ini Description 給定正整數序列x1 ,... , xn 。 (1)計算其最長遞增子序列的長度s。(嚴格遞增) (2)計算從給定的序列中最多可取出多少個長度為s的遞增子序列。 (3)如果允

[luoguP2766] 遞增序列問題(大流)

close spl 方法 emp 路徑 pid code display div 傳送門 題解來自網絡流24題: 【問題分析】 第一問時LIS,動態規劃求解,第二問和第三問用網絡最大流解決。 【建模方法】 首先動態規劃求出F[i],表示以第i位為開頭的最長上

【51NOD-0】1134 遞增序列

子序列 can algorithm view hide 但是 open sin cst 【算法】動態規劃 【題解】經典模型:最長上升子序列(n log n) #include<cstdio> #include<algorithm> #includ

遞增序列

str ear ont longest esp 一個 for n+1 div 1. 動態規劃,使用一個數組保存當前的最大遞增子序列長度,時間復雜度為O(N^2) # include <iostream> # include <cstdlib&

51nod 1376 遞增序列的數量(不是dp哦,線段樹 +  思維)

sort 是個 can stream const 方便 long 序列 printf 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 題解:顯然這題暴力的方法很容易想到

51nod 1218 遞增序列 V2(dp + 思維)

ear www str tdi binsearch tor con bsp href 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 題解:先要確定這些點是不是屬於最長

LCS 51Nod 1134 遞增序列

lcs ios else turn () black n) sca ret 給出長度為N的數組,找出這個數組的最長遞增子序列。(遞增子序列是指,子序列的元素是遞增的) 例如:5 1 6 8 2 4 5 10,最長遞增子序列是1 2 4 5 10。 Input

遞增序列(只求大小)模板

初始化 輸入 div 分法 下界 ive tdi color ostream #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>