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位置右邊都不合法,但是這個這個長度一定存在合法的長度的序列,所以找合法的最長子序列,應該倒著尋找。第一步 排序,保證二分尋找乙個最長上公...