動態(tài)規(guī)劃DPLeetcode354俄羅斯套娃信封問題

https://leetcode-cn.com/problems/russian-doll-envelopes/

????在看labuladong的算法書的時候,里面提到了這道信封嵌套問題。

????當(dāng)我們面對一個陌生的題目時,首先要想的就是如何將其轉(zhuǎn)換成我們熟悉的問題。信封嵌套問題其實本質(zhì)上就是一個二維的遞增子序列問題。但是對二維的問題我并沒有接觸過,而一維的遞增子序列我卻很熟悉,之前已經(jīng)做過兩道了??。于是便可以考慮是否將二維遞增子序列問題進行降維,轉(zhuǎn)換成我們熟悉的一維問題。

? ? 將二維數(shù)組進行排序,首先按寬度進行升序排序,當(dāng)寬度相同時將對應(yīng)的高度進行降序排序(確保不會出現(xiàn)將寬度相同的信封嵌套的情況)。于是便成功地進行了降維。

? ? C++ STL里地sort算法,允許用戶指定指定一個仿函數(shù)(functor)作為排序依據(jù)【源自STL源碼剖析】。這里的代碼利用地lambda表達式來對排序依據(jù)進行指定,也就是上面提到地排序規(guī)則。

class?Solution?{

public:

????int?maxEnvelopes(vector<vector<int>>&?envelopes)?{

????????int?ans?=?0,?size?=?envelopes.size();

????????if(envelopes.empty())?return?0;

????????sort(envelopes.begin(),?envelopes.end(),?[](const?vector<int>&a,?const?vector<int>&b){

????????????return?a[0]<b[0]?||?(a[0]==b[0]?&&?a[1]>b[1]);

????????});

????????vector<int>?dp(size,1);

????????for(int?i?=?0;?i?<?size;?++i){

????????????for(int?j?=?0;?j?<?i;?++j){

????????????????if(envelopes[j][1]<envelopes[i][1]){

???????????????????dp[i]=max(dp[i],dp[j]+1);

????????????????}

????????????}

????????????ans?=?max(ans,?dp[i]);

????????}

????????return?ans;

????}

};

這里的實現(xiàn)還可以利用二分法進一步優(yōu)化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容