HDU 1160 (LIS 列印路徑)

2021-10-03 18:16:04 字數 1585 閱讀 1244

還是自己對lis理解的不夠深刻,路徑長度大小不說,雖然排序了,但是肯定存在不合法的,lis在維護的時候,如果不夠增加最長子序列,就會在pos位置降值,就會出現pos位置右邊都不合法,但是這個這個長度一定存在合法的長度的序列,所以找合法的最長子序列,應該倒著尋找。

第一步:排序,保證二分尋找乙個最長上公升子串行

第二步,倒著尋找路徑,dp陣列的意義:以i結尾的最長上公升子串行值是dp[i],

//#pragma gcc optimize(2)

#include

//typedef long long ll;

//#define ull unsigned long long

#define int long long

#define f first

#define s second

#define endl "\n"

//<#define eps 1e-6

#define lowbit(x) (x&(-x))

#define pi acos(-1.0)

#define inf 0x3f3f3f3f

#define maxn 0x7fffffff

#define inf 0x3f3f3f3f3f3f3f3f

#define pa pair

#define ferma(a,b) pow(a,b-2)

#define pb push_back

#define all(x) x.begin(),x.end()

#define memset(a,b) memset(a,b,sizeof(a));

#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

using

namespace std;

void

file()

struct node

;vectorvec;

bool

cmp(

int a,

int b)

signed

main()

sort

(all

(a),cmp)

;int index=0;

for(

int i=

0;i;else

dp[pos]

=num,path.pb(

);}int len=dp.

size()

; cout

int>

>sta;

for(

int i=cnt-

1;i>=0;

--i)

while

(!sta.

empty()

) cout

).s

return0;

}

HDU1800(貪心,lis變形)

題意 給你n個數,求這些數經過排序後能組成幾組嚴格上公升子串行。解題思路 一開始直接排序模擬,時間複雜度o n n 接著發現其實就是找序列中重複最多的元素。為什麼呢?你想,我們序列排完後假如都不重複就所有人共用1個掃把 如果某段有個元素重複,我們把它提出來,單獨一組,假如有多個重複,並且重複的元素都...

序列變換 HDU 5256 LIS

題意 給乙個數列,每乙個數都不相同且為整數,現求,最少需要修改多少次才能使該數列為嚴格上公升的。思路 首先,對於乙個嚴格上公升的整數數列a,一定有a i a i 1 1,所以,a i i a i 1 i 1 以此為線索,我們生成乙個新數列b i a i i,則b i b i 1 換句話說,a數列嚴格...

uva481 列印LIS路徑

對於lis的求解問題,我採用的是二分 貪心進行求解,然後對於列印路徑採用乙個f陣列記錄,f i 代表lis序列中的第i個元素的前面的乙個元素的位置 include include include include using namespace std const int n 1e5 5 int va...