還是自己對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...