bzoj 3193 JLOI2013 地形生成

2021-07-13 06:54:34 字數 2293 閱讀 3154

難忘多少個日子之前,我對著這道題死磕了將近1*(4+4+3)h的情景(差不多有一整個學校日:上午+下午+晚自習)……

都是淚啊……

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 1005

const

int inf = 1

<<30;

const

double eps = 1e-8;

typedef

long

long ll;

#define rep(i, s, t) for (int i = s; i <= t; i ++)

#define rst(arr) memset(arr, 0, sizeof(arr))

#define mx(a, b) ((a)>(b)?(a):(b))

#define mn(a, b) ((a)<(b)?(a):(b))

//#define debug

struct mount

}mount[maxn];

const

int mod = 2011;

int n;

int dp[maxn];

int main()

int sum = 0;

for (int k = mn(last, mount[i-1].key)-1; k>=0; k--)

(sum += dp[k])%=mod;

(ans2 *= sum)%=mod;

last = i;}}

printf("%lld %lld", ans1, ans2);

return

0;}

直接dp?怎麼弄,狀態上沒法記錄所有山位置。

(膜題解後)

原來要排序啊 還是從高到低排序

這樣一來,比當前插入的山高的一定已經插入了,對於每乙個位置,都可以找出來有幾座山在前面而且更高

後面的山可能插入已經擺好的山中,不能固定高的山的位置

這時,可以考慮把之前的山往後移動!因為新插入的山對之前的山不會造成影響!

(排序啊排序)

啟發:本題難點在於看上去沒有明顯階段性。要學得心明眼亮,才能發現dp的關鍵

要注意:高度相同時按關鍵值小到大排序 (很容易疏忽的情況)

(看題 10h後)

終於想通了第一問 然而 還有第二問

加入高度全部相同,那麼結果是一樣的,仍然考慮高度相同的一段

設排序後相同的這一段編號區間是[l+1,r] 把這一段往前i座山(已排好)裡面插

有l個空位置,每插入乙個產生乙個新序列 而且這樣不會產生重複(我們把[l+1,r]上已經插入的看成乙個空位) 答案按理就是c(l, r-l)

遺憾的是這樣會產生重複(打臉)口胡結束

不得已之下,我們題解想到了dp。 設f

[i][

j]是[l+1,r]區間內前i個數字(a[

l+1..l+i

] ) 插入[1,j]的方案數 (j<=l),其中要求a[r]放在第j位。任務就是給定了每座山的插入區間,求不同的擺放方案。

遞推式簡潔而優美:f[

i][j

]=f[

i−1]

[j]+

f[i]

[j−1

] 其中 j≤

a[l+

i].k

ey(為什麼這麼優美呢?是不是和組合數遞推式有點像啊qaq)

(不同之處也比較明顯:在於同一位置可以擺放多個,而且dp過程中加入了關鍵字大小對於元素位置的限制)

再解釋一下方程的意義吧

插入在第j個位置上,前i-1個數字也可以插在[1,j]上;

如果不插入,那這i個數字就想辦法插到[1,j-1]上。因為要保證j位置上有乙個i,就要把上乙個j移動過來得到一種新的合法方案。

也可以從字首和優化的角度考慮,原理稍微簡單,過程稍微繁瑣: f[

i][j

]=∑j

k=0f

[i−1

][k]

同理f[

i][j

−1]=

∑j−1

k=0f

[i−1

][k]

對上式作差也能得到我們的遞推方程。

對答案的貢獻:∑m

in−1

i=0f

[r−l

][i]

複雜度o(

n2)

bzoj3193 JLOI2013 地形生成

最近ik正在做關於地形建模的工作。其中乙個工作階段就是把一些山排列成一行。每座山都有各不相同的標號和高度。為了遵從一些設計上的要求,每座山都設定了乙個關鍵數字,要求對於每座山,比它高且排列在它前面的其它山的數目必須少於它的關鍵數字。顯然滿足要求的排列會有很多個。對於每乙個可能的排列,ik生成乙個對應...

BZOJ 3193 JLOI2013 地形生成

很難的一道題 首先第一問,如果沒有高度相同的,因為只有比他高的會產生影響,所以降序排序,然後從大往小往裡插入,那麼可插入的位置的個數就是min i,key 然後我們考慮有重複的,若不考慮之前已經插入過的相同高度的,方案數仍然是min i,key 那麼現在矛盾的就是,新插入的關鍵字和之前的關鍵字的關係...

BZOJ 2764 JLOI2011 基因補全

題目 題意 給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,配對的規則是a與t配對,c與g配對,新增鹼基的位置與數量不同的方案視為不同,求不同的方案數。0n 2000 題解 可以考慮算出序列t在序列s裡匹配的本質不同方案數,利用dp可以很...