雖然說是動態規劃實則就是在暴力找答案。
我們答案要求的是兩個區間,所以我們只要選取乙個區間,然後列舉這個區間往前的所有區間能提供的最大答案就好了。
我們需要什麼呢value[i] , 區間的最後位置是i,這個區間的權值總和.
這個value可以用字首和輕鬆算。
下乙個就是fmax[i],代表的是[1,i]這些位置能構成的最大區間權值然後答案明顯就是
ans =
max(ans, value[i]
+ fmax_[i - k]
);
當我們寫出value陣列後就可以直接寫出fmax陣列了。
綜上所述複雜度是o(n)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define int long long
#define double long double
using
namespace std;
#define pi 3.1415926535898
#define eqs 1e-17
const
long
long max_ =
200000+7
;const
int mod =
1e9+7;
const
int inf =
1e9+7;
const
long
long inf =
1e18
;int
read()
while
(ch >=
'0'&&ch <=
'9')
return s * f;
}inline
void
write
(int x)
if(x >9)
write
(x /10)
;putchar
(x %10+
'0');}
inline
intmin
(int a,
int b)
inline
intmax
(int a,
int b)
int tree_[max_]
,value[max_]
,n,k,sum[max_]
,fmax_[max_]
;signed
main()
memset
(value,
128,
sizeof
(value));
for(
int i =
1+ k -
1; i <= n; i++
) fmax_[1]
= value[1]
;for
(int i =
2; i <= n; i++
)//value[i], 以i為結尾的權值
int ans =
-inf;
for(
int i =
2* k; i <= n; i++
) cout << ans << endl;
}return0;
}
牛客 NC15553 數學考試
思路 先把字首和求出來.類似於dp,當前節點為i的時候,我們要記錄下i之前的連續k個數和的最大值lmax.這就是第一段 然後讓j i k,讓rmax a j a i 這樣然後max max max,lmax rmax 這樣的複雜度是o n 看 include include include incl...
數碼 牛客每日一題
題意 給定兩個整數 l 和 r 對於所有滿足 1 l x r 10 9 的 x 把 x 的所有約數全部寫下來。對於每個寫下來的數,只保留最高位的那個數碼。求1 9每個數碼出現的次數。思路 可以轉化為1到 r 的問題,列舉約數 a,找到有多少約數 b,使得 a b 在1 到 r 的範圍內。統計數量。a...
牛客每日一題 保護花
題目連線 這個很明顯是貪心,推導一下公式 假設這一群牛中有a b這兩頭,他們的值分別是ati adi,bti bdi,並且已經知道了總的di值sdi 假設先運a牛就是比先運b牛好,說明先運a牛總的損壞低 則有 sdi adi 2 ati sdi bdi 2 bti 可以發現當 adi 越高 ati越...