P5774 JSOI2016 病毒感染

2022-07-19 03:36:14 字數 1084 閱讀 8515

題目鏈結

有\(n\)個小鎮爆發了疫情,其中第\(i\)個小鎮每天會死\(a_i\)個人,現在從第乙個小鎮出發,每一天可以選擇:

求最少死亡人數

\(n≤3000,a_i≤10^9\)

可以發現,每個村莊只可能在第一次被經過或第二次被經過時**被**,換句話說,在區間\([l,r]\)進行一次往返走\((l \rightarrow r \rightarrow l \rightarrow r)\)可以**該區間內的所有村莊,並且總過程就是由一連串的"往返走"組成的

不妨先設\(f(i)\)表示**前\(i\)個村莊的最少死亡人數,\(v(i,j)\)表示在區間\([l,r]\)進行一次往返走後該區間的最少死亡人數,轉移也比較好推,就是細節比較多:

$f(i) = min \^n+v(i+1,j)\}(0≤j<i)$

顯然這個\(v(i,j)\)也是可以用\(dp\)預處理出來的,分類討論**的時間,有轉移:

$v(i,j) = v(i+1,j)+ \begin2×\sum\limits_^ja_x\\3×(j-i)×a_i+\sum\limits_^ja_x\end$

時間複雜度\(o(n^2)\)

//xcxc82 2021/1/19/22:03

#includeusing namespace std;

#define int long long

const int maxn = 3010;

inline int read()

while(ch>='0'&&ch<='9')

if(flag) return x;return ~(x-1);

}int n,a[maxn];

int v[maxn][maxn],sum[maxn];

int f[maxn];

signed main()

for(int len=1;len<=n-1;len++)

} for(int i=1;i<=n;i++)

} printf("%lld",f[n]);

return 0;

}

P4322 JSOI2016 最佳團體

01 0101 分數規劃與樹形dpdp dp結合題意 求 pi s i frac si p i 的最大值,我們可以二分乙個v vv,則我們只需要求 pi s i v p i s i v 0 sum sum v sum sum v 0 pi s i v p i si v 0就okok ok讓每乙個點的...

P4046 JSOI2010 快遞服務

傳送門 很容易想出 o n 3m 的方程,三維分別表示某個快遞員現在在 然後直接遞推即可 然而這樣會t,考慮怎麼優化。我們發現每一天的時候都有乙個快遞員的位置是確定的,即在前一天要到的位置。那麼我們只要列舉剩下的兩個人分別在 就行了,複雜度變為 o n 2m minamoto include def...

P4053 JSOI2007 建築搶修

小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復每個建築...