首先講題目意思,第一問求最長不上公升子串行,第二問求最長上公升子串行,說實話第二問一開始我沒看出是求上公升子串行的,看了別的大佬的題解才發現用上公升子串行。
第一種,簡單的動態規劃,o(n^2)的演算法
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace
std;
int a[100005],dp1[100005],dp2[100005];
int main()
}ans1=max(ans1,dp1[i]);
}for(int i=1; i<=n; i++)
}ans2=max(ans2,dp2[i]);
}printf("%d\n",ans1);
printf("%d\n",ans2);
return
0;}
**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace
std;
int a[100005],dp[100005];
int main()
else
}if(l!=0)
dp[l]=a[i];}}
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
else
}dp[l]=a[i];}}
printf("%d\n",ans1);
printf("%d\n",ans2);
return
0;}
第三種,我只能說stl真好啊,也是o(n*logn)的演算法,同樣借鑑大佬
這裡最重要的是兩個函式lower_bound和upper_bound,自己去查,解決最長上公升子串行的好東西
其實思路和上一種方法一樣,只是好寫並且短
**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace
std;
int a[100005],dp1[100005],dp2[100005];
struct cmp
};int main()
printf("%d\n",ans1);
printf("%d\n",ans2);
return
0;}
第四種,用樹狀陣列寫,o(n*logn)的演算法
這種方法我就不放**了,自己寫吧
P1020 飛彈攔截 最長上公升子串行
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...
洛谷P1020 最長不上子串行及其個數
題目大意 輸入若干飛彈的高度,用炮彈攔截,第一發炮彈能達到任意高度,第i發炮彈不能高於第i 1發炮彈。求乙個炮彈系統能攔截的最多的飛彈和若要攔截所有的飛彈最少需要有多少炮彈系統 第一問即求最長不上公升子串行的長度 第二問即求最長不上公升子串行的個數 而求最長不上公升子串行的個數即求最長上公升子串行的...
洛谷P1020 飛彈攔截
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...