最少攔截系統(經典LIS DP)

2021-10-04 03:16:10 字數 1776 閱讀 9862

題意:求最長上公升子串行lis的長度;

1、o(n^2) dp:

#include

using

namespace std;

int a[

100010];

int dp[

100010];

//dp[i] 代表以a[i] 結尾的子串的最長上公升子串行的長度

intmain()

ans =

max(dp[i]

,ans)

;//取每個子串行的最值

} cout<}return0;

}

dp輸出路徑:

#include

using

namespace std;

const

int n =

1010

;int a[n]

,dp[n]

;int g[n]

;//記錄當前狀態是從哪個狀態轉移來的

intmain()

}}int k =1;

for(

int i=

1;i<=n;i++)if

(dp[i]

> dp[k]

) k = i;

//尋找最長的子串行

printf

("%d\n"

,dp[k]);

for(

int len=dp[k]

;len>=

1;len--

)return0;

}

2、o(nlogn) 利用二分:

#include

using

namespace std;

int a[

100010];

int low[

100010];

//low[i] 代表以a[i] 結尾的子串的最長上公升子串行的結尾的最小值

intmain()

}// for(int i=1;i<=ans;i++) cout}return0;

}

最近又發現了這種寫法,不錯~

#include

#include

#include

using

namespace std;

int a[

100010];

int low[

100010];

//存目標子串行

intmain()

// for(int i=1;i<=ans;i++) coutreturn0;

}

手動二分

#include

using

namespace std;

const

int n =

1e5+9;

int f[n]

, a[n]

;//多組無需清空

int n;

intfind

(int l,

int r,

int x)

else

}return l;

}int

main()

printf

("%d\n"

, len);}

return0;

}

最少攔截系統

description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.怎麼辦呢...

最少攔截系統

題目 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.怎...

最少攔截系統

b 最少攔截系統 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能...