codeforces 704B

luogu鏈接

解法

高妙的dp:
首先調整一下權值:
ai=ai+xi,bi=bixi,ci=ci+xi,di=dixia_i=a_i+x_i,b_i=b_i-x_i,c_i=c_i+x_i,d_i=d_i-x_i
這樣就可以:
f(i,j)=di+aj      (i<j)f(i,j)=d_i+a_j~~~~~~(i<j)
f(i,j)=ci+bj      (i>j)f(i,j)=c_i+b_j~~~~~~(i>j)
然後似乎是一種套路dp模式:記dp[i][j]dp[i][j]表示前i-1個點,形成了j條鏈的最小權值和,枚舉一下第i個點的連邊方式(好像和插頭dp有點類似)進行轉移。
最後答案是dp[n+1][1]dp[n+1][1]
首先考慮(i!=s)(i!=e)(i!=s)且(i!=e)的情況:
首先s和e所在的鏈會在最後合併,所以j(i>e)+(i>s)j\ge (i>e)+(i>s),表示至少有哪些鏈,然後枚舉i的兩個插頭的方向:
如果向i連邊的點比i小,那麼i貢獻一個aia_i,否則貢獻一個bib_i,然後i連出去的點比i小,i貢獻一個cic_i,否則貢獻一個did_i,然後再這些連邊過程中,可能會出現改變鏈總數的情況:當i貢獻aia_icic_i的時候,說明原先兩條沒有關係的鏈被連到了一起。鏈的總數-1.
當i貢獻bib_idid_i的時候,說明這個點所在的鏈和之前i-1個點沒有關係。需要新加一條鏈。
然後剩下的兩種情況要注意,它們能否出現要通過討論p的數量和i,s,e的位置關係。
考慮i==si==s的情況:
這個時候只能從i向其它點連邊,其它的分類討論和上面一樣
i==ei==e的情況
這時候只能從其他點連回i。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章