考慮區間 \(dp\) , \(f_\) 表示刪完 \(l,r\) 這個區間的最大價值
考慮 \(l,r\) 在一次被刪掉
發現好的子串一定是前一段上公升,後一段下降
於是可以再開兩個 \(g_\) 表示以 \(l,r\) 分別為兩個端點中間剩下恰好遞增或遞減的最大價值
那麼可以列舉乙個最大值的位置轉移
\(l,r\) 不在一次被刪掉,可以列舉乙個斷點來轉移
因為可以不刪完,所以可以再開個 \(dp\) 解決
code#include#define int long long
#define rint signed
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,ans,u;
int a[410],v[410];
int f[410][410],g1[410][410],g2[410][410],f[410];
signed main()
for(int k=l;k<=r;k++) if(a[k]>=a[l]&&a[k]>=a[r]&&a[k]*2-a[l]-a[r]+1<=n) f[l][r]=max(f[l][r],g1[l][k]+g2[k][r]+v[a[k]*2-a[l]-a[r]+1]);
for(int k=l;k
只會暴力列舉出邊
設 \(f_i\) 表示長度為 \(i\) 的悅耳的旋律的個數
那麼 \(f_i=\prod\limits_^nv_i-\sum\limits_^\left \lfloor \frac \right \rfloor f_j\prod\limits_^v_k\)
就是考慮列舉最小的 \(border\) 進行轉移(如果有 \(border\) 那麼最小 \(border\) 的長度一定小於 \(\frac\) ),前面的和後面的一樣,中間的可以隨便選
設 \(s_i=\prod\limits_^iv_j\)
於是 \(f_i=s_i-\sum\limits_^ \right \rfloor}f_js_s_j^\)
發現可以分治 \(ntt\) 做
而且只需要計算 \([1,\frac]\) 的值,最後再 \(o(n)\) 算 \(f_n\)
code#include#define int long long
#define rint signed
#define mod 998244353
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,ans,len,l,inv;
int s[2097152],inv[2097152];
int f[2097152],g[2097152],r[2097152];
int a[2097152],b[2097152];
inline int qpow(int x,int k)
return res;
}inline void init(int len,int l)
inline void ntt(int a){
for(int i=0;i>1;d>=1) for(int i=0;i>1;solve(l,mid);
for(len=1,l=0;len
省選模擬14
t1 要求乙個類似尤拉迴路的東西 考慮其實就是將奇度數點兩兩配對,配對的代價為最短路長度,求最小代價 發現邊權的特殊性 2 i 有乙個很好的性質 sum limits 2 i 2 n 那麼最短路就都是最小生成樹上的路徑 只需要跑出最小生成樹,然後在樹上配對就行了 t2 神題owo 將 i,j i j...
省選模擬14
屬實這場考試是順了我的心意 考場200整,第二題掛掉了10分,第三題的暴力dp沒有想到.第一題不知道我咋了,竟然成功的剪掉了狀態然後切掉了 第二題期望資料是隨的,於是我打了個暴力,期望複雜度 mathcal 最劣複雜度 mathcal 第三題抓住了一點點性質,但是想偏了,於是只打了暴搜 區間dp,這...
省選模擬 14
老規矩,禮尚往來。我覺得題目的英文名字比中文名字好看一些,中文名字就乙個字,好 色 樂。題目要求不一定刪完,如果我們知道強制刪完每個區間的最大價值,剩下的操作就是乙個簡單的 n 2 dp。現在我們只需要求出來刪掉每個區間的最大價值。考慮區間dp。討論區間端點l,r是不是同時被刪去的。如果不是,那麼整...