題意:求最長上公升子串行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 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能...