最長遞增(不減)子串行

2021-09-08 19:23:42 字數 1226 閱讀 8984

問題:

拿poj 2533來說。

sample input

71 7 3 5 9 4 8

sample output(最長上公升/非降子串行的長度)

解法一(o(n^2)):

如何把這個問題分解成子問題呢?經過分析,發現 「求以ak(k=1, 2, 3…n)為終點的最長上公升子串行的長度」是個好的子問題――這裡把乙個上公升子串行中最右邊的那個數,稱為該子串行的「終點」。雖然這個子問題和原問題形式上並不完全一樣,但是只要這n個子問題都解決了,那麼這n個子問題的解中,最大的那個就是整個問題的解。

由上所述的子問題只和乙個變數相關,就是數字的位置。因此序列中數的位置k 就是「狀態」,而狀態 k 對應的「值」,就是以ak做為「終點」的最長上公升子串行的長度。這個問題的狀態一共有n個。狀態定義出來後,轉移方程就不難想了。假定maxlen (k)表示以ak做為「終點」的最長上公升子串行的長度,那麼:

maxlen (1) = 1

maxlen (k) = max

stacksize = 0;

}void output()

}else}}

}int maxx = -1;

int finalindex;

for (int i = 0 ; i < len; i++)

}while(finalindex!=-1)

reverse(seq.begin(), seq.end());

// for (int i = 0 ; i < len; i++)

// cout << endl;

return maxx;

}//不減版本

int binsearch(int s,int e, int value)

else

}int middle = (e+s)/2;

if (value == stack[middle])//這裡決定是否要遞增,或者不減.注釋為遞增

return middle;

}if(value < stack[middle])

else

}//o(nlog(n))

int algorithm2()

else

}else

else}}

return stacksize;

}int main()

}else

}//output();

return 0;

}

最長公共子串行 最長遞增子串行 最長遞增公共子串行

求最長公共子串行 int dp maxn maxn int a maxn b maxn int main else dp i j max dp i 1 j dp i j 1 printf d n dp m n return 0 輸出最長公共子串行 int dp maxn maxn int d max...

最長公共子串行 最長連續公共子串行 最長遞增子串行

面試中除了排序問題,還會經常出現字串的子串行問題,這裡講解使用動態規劃解決三個常見的子串行問題 1 最長公共子串行問題 lcs,longest common subsequence problem 2 最長連續公共子串行問題 3 最長遞增子串行 lis,longest increment subse...

子串行1 最長遞增子串行

子串行問題本來就比子串和子陣列要難,因為子串行是不連續的,窮舉困難,而且子串行一般涉及兩個字串,一般來說都是讓求乙個最長子序列,涉及子串行和最值,那一定是動態規劃,o n2 1.定義dp陣列有兩種思路,第一種是乙個一維的dp陣列,兩次for迴圈來解決,dp i 的含義是在array陣列中,以arra...