思路:很明顯的dp,但是很遺憾,就是不會做。該題的做法個人感覺是最大子串行和的擴充套件,拓寬到了3維狀態。
第二維表示當前選的是第幾段,第三維標記當前任務是否要取。
所以 每個位置遍歷三段
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]) //當前任務不選繼承最值
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j][1]+p[i]) //當前任務選擇 取最值
同時為了避免單點情況,在j>=1時 需要進行特判, dp[i][j][1]=max(dp[i][j][1],max(dp[i-1][j-1][0],dp[i-1][j-1][1])+p[i])
// 雖然每段前的最值是定值,但內層的段遍歷時該位置斷點值也進行了更新,所以需要用2層max去最值。
需要注意的是1 2 3 -1 -1 -1 -1這種單個任務為段的情況,需要在內部迴圈中加上斷點的特判。
**如下:
#include#include#include#include#include#include#include#include#define per(i,a,b) for(int i=a;i<=b;++i)
#define rep(i,a,b) for(int i=a;i>=b;--i)
#define inf 0x3f3f3f
#define ll long long int
using namespace std;
int dp[1000005][3][2];
int p[1000005];
int main()
} cout<
return 0;
}
藍橋杯校內模擬值序列
問題描述 小明想知道,滿足以下條件的正整數序列的數量 第一項為 n 第二項不超過 n 從第三項開始,每一項小於前兩項的差的絕對值。請計算,對於給定的 n,有多少種滿足條件的序列。輸入格式 每一行包含乙個整數n。輸出格式 輸出乙個整數,表示答案。答案可能很大,請輸出答案除以10000的餘數。樣例輸入 ...
藍橋杯模擬題 擺動序列
問題描述 如果乙個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為乙個擺動序列。即 a 2i a 2i 小明想知道,長度為 m,每個數都是 1 到 n 之間的正整數的擺動序列一共有多少個。輸入3 4 輸出14 include using namespace std int a 1010 1010...
十一屆藍橋模擬 擺動序列
問題描述 如果乙個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為乙個擺動序列。即 a 2i a 2i 小明想知道,長度為 m,每個數都是 1 到 n 之間的正整數的擺動序列一共有多少個。輸入格式 輸入一行包含兩個整數 m,n。輸出格式 輸出乙個整數,表示答案。答案可能很大,請輸出答案除以100...