難忘多少個日子之前,我對著這道題死磕了將近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可以很...