Description:
一個數組,保證相鄰兩個元素值得差小於1,問題,最大值和最小值的差 < 1的區間長度最長是多少ios
Solution:
仍是卡了一下,原本覺得是模擬就行了,可是卡時間,想來想去最後仍是忽略了一個地方,就是它的保證,相鄰元素值得差小於1,就保證了這個序列得變化是以1或0爲單位相鄰變化的,因此不可能出現5 4 6,因此咱們考慮一個數字x的時候只要去找出現的位置就好,咱們要找的可能區間有x 和 x + 1區間或者x 和 x - 1區間,因此咱們看一下上一個x - 1 出現的位置和x + 1 出現的位置在哪,由於他倆不能共存,若是x - 1出現的位置靠後,咱們要計算的就是 x和x-1區間的長度,要看 (x - 2)出現的位置和x + 1出現位置的最大值,爲其限制,反之亦然,用一個dp數組維護就行了數組
#include <iostream> #include <cstdio> #include <cstring> #define inf ( 1 << 28 ) using namespace std; const int maxn = 1e5 + 1e3; int x; int dp[maxn]; int main() { int n; while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); int ans = 0; for(int i = 1;i <= n;i++) { scanf("%d",&x); if(dp[x - 1] > dp[x + 1])ans = max(ans,i - max(dp[x + 1],dp[x - 2])); else ans = max(ans,i - max(dp[x+2],dp[x-1])); dp[x] = i; } printf("%d\n",ans); } return 0; }