做兩遍dp,dp[k][i]表示前i個位置放k個鋸木廠的最小值
先把整個順序反過來,那麼0的位置就是山腳的鋸木廠
設sum[i],f[i]是sum[i]w[i]字首和,f2[i]是w[i]的字首和
dp[1][i]=f[i]-f[k]-sum[k+1](f2[i]-f2[k])+dp[0][k]
展開成f2[k]sum[k+1]-f[k]+dp[0][k]=f2[i]sum[k+1]+dp[1][i]-f[i]
k=f2[i]遞增,sum[k+1]遞增,希望截距dp[1][i]-f[i]盡可能小
畫圖分析得用單調佇列維護乙個下凸包
#includeusing namespace std;
const int maxl=2e4+10;
typedef long long ll;
int n;
ll w[maxl],d[maxl],sum[maxl],f[maxl],f2[maxl];
ll dp[3][maxl];
struct node
s[maxl];
inline void prework()
}inline ll calc(ll k,int id)
inline bool cmpk(node a,node b,node c)
inline void solv(int k)
; s[++tail]=d;
for(int i=1;i<=n;i++)
; while(headtail--;
s[++tail]=d; }}
inline void mainwork()
inline void print()
int main()
洛谷 P1437 HNOI2004 敲磚塊
在乙個凹槽中放置了 n 層磚塊 最上面的一層有n 塊磚,從上到下每層依次減少一塊磚。每塊磚 都有乙個分值,敲掉這塊磚就能得到相應的分值,如下圖所示。14 15 4 3 23 33 33 76 2 2 13 11 22 23 31如果你想敲掉第 i 層的第j 塊磚的話,若i 1,你可以直接敲掉它 若i...
洛谷 P2292 HNOI2004 L語言
ac自動機 dp 洛谷這題資料加強之後用bfs t了最後一兩個點 用了乙個dp陣列做轉移 注意一下字串下標的偏移 因為有了dp陣列 存下trie樹上的結尾結點的字串長度 注意一下ac自動機的空間和dp陣列的空間 其他就沒啥了 include include include include inclu...
洛谷 P2292 HNOI2004 L語言
標點符號的出現晚於文字的出現,所以以前的語言都是沒有標點的。現在你要處理的就是一段沒有標點的文章。一段文章t是由若干小寫字母構成。乙個單詞w也是由若干小寫字母構成。乙個字典d是若干個單詞的集合。我們稱一段文章t在某個字典d下是可以被理解的,是指如果文章t可以被分成若干部分,且每乙個部分都是字典d中的...