g - 選擇 ( dp 優化 )題意:
由於一些原因, cubercsl 又送了 compute 乙個長度為 n 的陣列。
但是 cubercsl 的興趣很奇怪,他要求 compute 從中選恰好 ⌊ n/2 ⌋ 個才能拿走( n/2向下取整 ),並且不能選擇在陣列中相鄰的數。
同時,compute 也有著奇怪的癖好 --- 他一定會選擇第 x 個數。
既然能拿,compute 當然想要越多越好。即他想知道,他能拿走的數的和最大是多少。
思路:容易想到用dp來做,dp[ i ][ j ] 表示前 i 個元素 取了 j 個的最大值。狀態遷移是dp[ i ][ j ] = max dp[ i-1 ][ j ] , dp[ i-2 ][ j-1 ] + a[ i ]
但是我們遷移方式是 n方 的,長度n是2e5的,所以需要優化。注意到無用狀態非常多,因為要取恰好 ⌊ n/2 ⌋ 個數,所以我們對於 i 只去更新 i/2 附近的幾個數就夠了。
我們寫一下10個數的序列,標註出 ⌊ i/2 ⌋, 很容易看出狀態規律。我們只需要維護 ⌊ i/2 ⌋ 和 ⌊ i/2 ⌋+1, 對於奇數和偶數分開討論。
還有最後乙個問題,他一定會選擇第x個數,我們只需要給第x個數增加乙個特別大的數,他就一定會選,答案再減去特別大的數就好了。
注意:寫的時候最好寫10000000000000000, 用1e16簡寫會出錯。
**:
#include#define int long long
using namespace std;
const int maxn = 2e5+10;
int a[maxn],dp[maxn][2]; // 0-> j=i/2 --- 1->j=i/2+1
signed main()
else
}cout << dp[n][0]-10000000000000000 << endl;
return 0;
}
Dp優化 斜率優化
該模板的ai要具有單調性,也就是sum陣列 若沒有單調性,加個二分即可 我的一篇題解,很詳細 1 寫出狀態轉移方程 2 按照斜率優化的式子推導出式子 3 代入模板即可。include include using namespace std typedef long long ll const int...
G 免費餡餅 DP
都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接...
斜率優化 DP
我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...