最長遞增子序列之我的第一個動態規劃
求(嚴格)最長遞增子序列
我在仔細參考了知乎作者王勐,徐凱強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 <
描述 求一個字串的最長遞增子序列的長度 如:dabdbf最長遞增子序列就是abdf,長度為4 輸入 第一行一個整數0
01.#include<stdio.h> 02.#include<string.h> 03.int main() 04.{ 05.char a[10000]; 06
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>