Uva481 LIS 路徑列印

2021-09-28 15:52:32 字數 2023 閱讀 2662

last陣列儲存在棧中的對應位置

題目要求找最後乙個lis,就直接從最後向前遍歷

因為後面能夠更新棧中元素的元素,下標靠後

所以不會影響尋找;

ac**

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e6+5;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

#define ls (i<<1)

#define rs (i<<1|1)

#define fi first

#define se second

#define mk make_pair

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

ll read()

return x*t;

}int tot,a[n]

,last[n]

,sta[n]

,ans[n]

;int

main()

else

}printf

("%d\n-\n"

,top)

;int len=top;

for(

int i=tot;i;i--

)//查詢lis

for(

int i=

1;i<=top;i++

)printf

("%d\n"

,ans[i]);

return0;

}/*-71092

3886

*/

id存棧內元素在原陣列的索引,last 類似於鍊錶的思想,連線 自己在棧內位置的前乙個位置的元素。

同樣該思想也是基於後面能夠更新棧中元素的元素,下標靠後的思想。

只有後面元素把top值更新了或者等於top(要找最後乙個lis),那麼last[ top ]即表頭才會被更新。

ac**

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e6+5;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

#define ls (i<<1)

#define rs (i<<1|1)

#define fi first

#define se second

#define mk make_pair

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

ll read()

return x*t;

}int tot,a[n]

,last[n]

,sta[n]

,id[n]

,ans[n]

;int

main()

else

}printf

("%d\n-\n"

,top)

;int k=id[top]

,cnt=0;

while

(k)for

(int i=cnt;i;i--

)printf

("%d\n"

,ans[i]);

return0;

}

uva481 列印LIS路徑

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

選美大賽 LIS列印路徑)

include include include includeusing namespace std const int maxn 105 int n int dp maxn int a maxn int pre maxn int path maxn int main dp 1 1 pre 1 1 ...

HDU 1160 (LIS 列印路徑)

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