這個dp狀態有點神。
首先考慮乙個最暴力的狀態:\(f_\)表示第乙個選了\(i\)個,第二個選了\(j\)個,第乙個結尾為\(k\),第二個結尾為\(u\)是否可行。
現在考慮消減狀態:
1.首先知道了處理到第幾個,那麼只要知道乙個長度就能推出另乙個。 因此狀態可以改為\(f_\)表示處理到了第\(i\)個,第乙個序列選了\(j\)個,第乙個序列結尾為\(k\),第二個序列結尾為\(u\)是否可行。(這並沒有減少維數,只是轉化下,方便處理。)
2.既然所有的數都要選,假設當前處理到了第\(i\)個,那麼第\(i-1\)個必定在結尾,因此我們可以消去一維:
\(f_\)表示處理到第\(i\)個,結尾是\(a_i\)的那個序列長度為\(j\),另乙個結尾為\(k\)是否可行。
3.貪心地想,乙個序列結尾越小越容易接數,因此可以將一維放到dp的值中:
\(f_\)表示處理到第\(i\)個,結尾是\(a_\)的那個序列長度為\(j\),另乙個結尾最小是多少。
現在我們已經將dp減到二維,於是就可以轉移了:
\(a_i>a_\):此時\(a_i\)可以拼接在\(a_\)後面:
\(f_=\min(f_f_)\)。
\(a_i>f_\):此時我們可以將\(a_i\)接到另乙個序列後面,於是我們交換兩個序列,因為另乙個序列後面接了\(a_i\),我們要符合定義,於是可得:
\(f_=\min(f_,a_)\)。
最後判斷\(f_\)是否為\(inf\)。
資料範圍不知道,到某dark上看了看,\(n\leqslant2000\)。
code:
#includeusing namespace std;
const int maxn=2010;
int t,n;
int a[maxn];
int f[maxn][maxn];
int main()
puts(f[n][n/2]<0x3f3f3f3f?"yes!":"no!");
} return 0;
}
P3200 HNOI2009 有趣的數列
我們稱乙個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件 1 它是從1到2n共2n個整數的乙個排列 2 所有的奇數項滿足a1 3 任意相鄰的兩項a2i 1與a2i 1 i n 滿足奇數項小於偶數項,即 a2i 1 現在的任務是 對於給定的n,請求出有多少個不同的長度為2n的有趣的數列。因為...
P3200 HNOI2009 有趣的數列
p3200 hnoi2009 有趣的數列 樣例輸入 3 10 樣例輸出 5 看樣例猜做法 大概猜一猜 觀察到答案是卡特蘭數列 接下來我們看看為什麼是這樣。首先化簡題目 對於乙個 2 n 的排列,我們要求 奇數字置上的數遞增 偶數字置上的數遞增 奇偶相鄰位置數遞增 奇怪的tip 偶奇相鄰不用遞增 首先...
洛谷 P3199 HNOI2009 最小圈
如果你能提供題面或者題意簡述,請直接在討論區發帖,感謝你的貢獻。對於一張有向圖,要你求圖中最小圈的平均值最小是多少,即若乙個圈經過k個節點,那麼乙個圈的平均值為圈上k條邊權的和除以k,現要求其中的最小值 輸入格式 第一行2個正整數,分別為n和m 以下m行,每行3個數,表示邊連線的資訊,輸出格式 一行...