給定長為 n m 1 的陣列 。定義正整數陣列 合法,當且僅當它長為
n ,且對任意 i 都有 max(ai, ai+1) = ci 或者 ai + ai+1 = ci 。
求合法 的個數。
n ≤ 3 × 103
令 di = min(ci 1, ci) ,有 ai ∈ [1, di] 。
我們從前往後去確定 ai 的值,可以發現 ai 與 ci 是否相等會對 ai+1 產生兩種完全不同的影響。
若 ai = ci ,這時 ai+1 只會受到 [1, di+1] 的取值範圍限制。
若 ai = ci ,這時在取值範圍的限制下,必須有以下兩者之一
ai+1 = ci
ai+1 = ci ai
初步設 fi 表示 ai = ci 時,a 的取值方案數;gi 表示所有 ai = ci的情況下,a 的取值方案數之和。
如果能寫出轉移式,最終答案就是 f1 + g1 。
根據之前的性質推導,我們有
若滿足 ci = di , 取 ai = ci ,有 fi+1 + gi+1 → fi • 用 [l, r] 表示 ai = ci 時,ai 的取值範圍,ai+1 所對應的取值範圍就應該是[l′ = ci r, r′ = ci l] ∩ [1, di+1] ,而且是 ai+1 決定 ai 1 若滿足 ci = di+1 ,取 ai+1 = ci ,有 fi+1 → gi 2 把 ci = di+1 的情況在 [l′, r′] 中除去,有 ai+1 取值 [l′, r′] 時,a 的取值方案數之和 → gi
可以發現圈 2 與原問題的模式非常相似,於是傳參 [l, r] 遞迴求解即可。
#include
using
namespace std;
const
int n =
3030
;const
int mo =
1e9+7;
int f[2]
[n],l[2]
[n],r[2]
[n],c[n]
,cnt[n]
;int
main()
int nowr =0;
for(
int j =
1; j <= cnt[cur]
; j++)}
if(nowr < c[i]-1
) cnt[ne]++;
l[ne]
[cnt[ne]
]= r[ne]
[cnt[ne]
]= c[i]
; f[ne]
[cnt[ne]
]= sum % mo;
cur = ne;
}int ans =0;
for(
int i =
1; i <= cnt[1]
; i++
)(ans +
=1ll
* f[1]
[i]*
(r[1
][i]
- l[1]
[i]+1)
% mo)
%= mo;
printf
("%d\n"
,ans);}
}
ACM競賽宣講
或許有人還不清楚這個比賽有什麼用。那我告訴你們,參加這個比賽,可以讓你期末 c 的成績 90分以上,讓你熟悉c與 c 語言,虐殺各種 c 實驗。經過兩個月的集訓,你可以在三分鐘內完成計算機二級 c語言機試,然後在監考驚訝的目光中瀟灑離開,深藏功與名。你也可以提前和下學期將要學習的資料結構,以及大二上...
開心的宣講之行
宣講會結束,基本過關。而能夠和同事們好好休息個半天。而在的士中的對話相信我很長時間都難以忘記,因為很愜意和放送,和sdm與同事間毫無距離。黑色地帶 與 人頭符號 的戲言讓我們樂個不停。而午夜來到綠茵閣來吃飯也是氣氛與平時格外不同。我的田雞飯和同事的飯得到廚師們格外的關照 鹽分特足,除這點外還是吃得津...
宣講會 策劃雜談
用時 一般 1小時到3小時左右 要看 所用場地 預計來人數量 天氣等 注意宣講會時間很重要 乙個暴風雨後是韓流天氣是很難舉辦一場熱鬧的宣講會的,選擇時間一定要以聽講的人的心理去想。例如大學中 周一到周五 來的人會多 晚上6 00就比中午 要好 中午有要比 上下午好 除非你確定各個院系那個時間都沒課 ...