P3205 HNOI2010 合唱隊 題解

2021-10-08 06:01:08 字數 2490 閱讀 2724

同步

原題鏈結

簡要題意:

有長度為 n

nn 的序列 a

aa 和乙個空序列 b

bb. 下面進行操作:

每個 a

aa 唯一對應乙個 b

bb,但是每個 b

bb 並不唯一對應乙個 a

aa.現在已知 b

bb 序列,試求滿足條件的 a

aa 序列的個數。答案對 19260817

19260817

192608

17取模。

n

≤1000,a

i≤

2000

n \leq 1000 , a_i \leq 2000

n≤1000

,ai​

≤200

0.考慮區間 dp

\text

dp.用 f i,

jf_

fi,j

​ 表示 [i,

j]

[i,j]

[i,j

] 區間的答案,但是我們需要知道前乙個元素的值,因此可以令 fi,

j,0f_

fi,j,0

​ 表示 [i,

j]

[i,j]

[i,j

] 區間,當前最後一次操作在 i

ii;fi,

j,1f_

fi,j,1

​ 則最後一次操作在 jjj.

不難得出:

f_ = f_ = 1 \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space,i=j \\ f_ = f_ * (a_i < a_) + f_ * (a_i < a_j) , i \not = j\\ f_ = f_ * (a_j > a_i) + f_ * (a_j > a_) , i \not = j\\ \end

⎩⎪⎨⎪⎧​

fi,j

,0​=

fi,j

,1​=

1,i=

jfi,

j,0​

=fi+

1,j,

0​∗(

ai​+1​)

+fi+

1,j,

1​∗(

ai​​),i

​=j

fi,j

,1​=

fi,j

−1,0

​∗(a

j​>ai

​)+f

i,j−

1,1​

∗(aj

​>aj

−1​)

,i​

=j​

其中 (a)

(a)(a

) 表示 a

aa 成立則為 1

11,否則為 0

00,可以免去條件判斷。

本質實在考慮當前從 i+1

→i

i+1 \rightarrow i

i+1→

i 還是 j↔i

j \leftrightarrow i

j↔i 還是 j−1

→j

j-1 \rightarrow j

j−1→

j,不難發現。

時間複雜度:o(n

2)

\mathcal(n^2)

o(n2).

實際得分:100pt

s100pts

100pts

.

#include

using

namespace std;

int n,a[

1001];

int dp[

1001][

1001][

2];//不小心寫成了 dp,見諒

const

int p=

19650827

;inline

intread()

intmain()

//區間 dp 套路

printf

("%d\n"

,(dp[1]

[n][0]

+dp[1]

[n][1]

)%p)

;//注意取模

return0;

}

洛谷P3205 合唱隊

題目 區間dp。但是跟平常的區間dp不同的是,這個題僅僅只是運用了區間dp的通過小區間的資訊更新大區間的資訊,而沒有運用列舉斷點的區間dp一般思路。這個題我們首先發現每個人在插入的時候一定插入到隊伍的最前方或最後方,所以當要插入該數的時候,要比較的數是隊伍的最前方或最後方,然後用加法原理。與其說是d...

P3203 HNOI2010 彈飛綿羊

題目大意 有n個裝置,每個裝置設定初始彈力係數ki,當達到第i個裝置時,會往後彈ki步,達到第i ki個裝置,若不存在第i ki個裝置,則被彈飛。求從第i個裝置起步時,被彈幾次後會被彈飛。帶修改操作,下標0開始 分析 開始打算倒著跑一遍記錄每個位置彈飛要多少次,但是發現這樣做修改操作複雜度 為了減少...

P3203 HNOI2010 彈飛綿羊

某天,lostmonkey發明了一種超級彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請小綿羊一起玩個遊戲。遊戲一開始,lostmonkey在地上沿著一條直線擺上n個裝置,每個裝置設定初始彈力係數ki,當綿羊達到第i個裝置時,它會往後彈ki步,達到第i ki個裝置,若不存在第i ki個裝置,則綿羊被彈飛...