題目描述:
牛牛現在有乙個n個數組成的數列,牛牛現在想取乙個連續的子串行,並且這個子串行還必須得滿足:最多隻改變乙個數,就可以使得這個連續的子串行是乙個嚴格上公升的子串行,牛牛想知道這個連續子串行最長的長度是多少。
一開始看到這個題,總是被繞進「改變乙個數」中,就想說是不是遍歷陣列,然後每個數都嘗試改變,這樣改變後又要遍歷一次。想來這不可行。
其實要用動態規劃的思想。
當要改變某個數i時,其實該數把陣列分為了i之前和i之後,那麼:
定義dp1儲存的是以某數為起始的最長序列,dp2為以某數為結束的最長序列;
定義陣列為a。
邊界:dp1[n-1] = 1,dp2[0] = 1
且若a[i-1]若a[i]得到dp1和dp2之後還要再從頭遍歷一遍陣列 得出maxlen,這時要考慮若改變i那前面和後面能否連起來形成增。
code:(c++)
#include#includeusing namespace std;
int main()
vectordp1(n,0); //kaishi
vectordp2(n,0);
dp1[n-1] = 1;
dp2[0] = 1;
for(int j = n-1;j>0;j--)
else
}int maxlen = 1;
int result = 1;
for(int i = 0;i<=n-1;i++)
else if(i==n-1)
else if(a[i-1]+1result)
}cout《此題的解法其實不在乎將i改變成什麼值,而是它改變之後能否單調遞增。
若a[i-1]加上1之後都比a[i+1]小,則把a[i]變為a[i-1]+1後即可形成單調增。
總結:這是一道值得揣摩的題。
牛牛的數列 牛客網
牛牛現在有乙個n個數組成的數列,牛牛現在想取乙個連續的子串行,並且這個子串行還必須得滿足 最多隻改變乙個數,就可以使得這個連續的子串行是乙個嚴格上公升的子串行,牛牛想知道這個連續子串行最長的長度是多少。輸入包括兩行,第一行包括乙個整數n 1 n 10 5 即數列的長度 第二行n個整數a i,表示數列...
牛客 牛牛的數列
鏈結 牛牛的數列 時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 牛牛現在有乙個n個數組成的數列,牛牛現在想取乙個連續的子串行,並且這個子串行還必須得滿足 最多隻改變乙個數,就可以使得這個連續的子串行是乙個嚴格上公升...
牛客網 牛牛找工作
時間限制 2秒 空間限制 65536k 為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標 准來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好...