給定乙個序列,求能覆蓋整個序列的最少的不上公升子串行的個數。
考慮貪心,維護乙個陣列,陣列裡面存的是每個不上公升子串行的最後乙個元素。
遍歷原序列中的每乙個元素,如果當前元素比陣列中所有的元素都大,即它不能作為之前那些不上公升子串行的結尾。因此插入陣列最後。
反之,找到大於等於它的第乙個元素,也就是它可以接在那個元素之後,即可作為那個不上公升子串行的結尾,因此替換掉那個元素。
通過上述過程的分析,發現問題轉化為了求最長上公升子串行問題。
這裡有兩個結論:
「能覆蓋整個序列的最少的不上公升子串行的個數」等價於「該序列的最長上公升子串行長度」
「能覆蓋整個序列的最少的不下降子串行的個數」等價於「該序列的最長下降子串行長度」
#include #include #include #include using namespace std;
const int n = 1010;
int a[n], f[n], g[n];
int main()
ans1 = max(ans1, f[i]);
ans2 = max(ans2, g[i]);
}printf("%d\n%d", ans1, ans2);
return 0;
}
攔截飛彈 貪心
問題描述 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統,但是這種攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,由於該系統還在試用階段。所以一套系統有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出的高...
攔截飛彈(DP)
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈 攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的 飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達...
DP 攔截飛彈
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...