有個大樓有n層,每層都有兩種人,一種喜歡的打球,一種喜歡游泳,現在要你在每一層要麼開設球館,要麼開設游泳館,分配完畢以後,打球的要到球館,游泳的要到游泳館,問最優分配下,所有人要移動的最短距離和是多少?
dp[i][0/1]表示第i層布置為0或1,且i+1層為1或0(與第i層相反)的最小代價。
dp[i][0]可以由dp[j][1]轉移過來,其中j小於i,那麼我們考慮j+1到i的這些層要建成0,考慮使得代價最小,那麼這些層所有1的人都要分別向兩邊離開。比如3,4,5,6層,3層和4層的1會去2層,5層和6層的1要去7層。
這樣狀態轉移方程為dp[i][0/1] = dp[j][1/0] + tmp。這裡tmp的計算可以利用字首和優化。使得整個演算法複雜度為o(n^2)。
另外要注意邊界處理,具體實現看**:
#include
using
namespace
std;
typedef
long
long ll;
const
int maxn = 4005;
const ll inf = 0x3f3f3f3f3f3f3f3f;
ll a[maxn][2], dp[maxn][2], sum[maxn][2];
int main()
ll ans = inf;
for (int i = 1; i < n; i++)
ll tt = 0;
for (int j = i + 1; j <= n; j++) tt += a[j][k] * (j - i);
//cout << tt << endl;
ans = min(ans, dp[i][k] + tt);}}
printf("case #%d: %lld\n", ++cs, ans);
}return
0;}
cf 327A 字首和優化dp
小i有些無聊,所以他發明了乙個在紙上玩的遊戲。他寫下了n個整數a1,a2,a3,a4 an,每個都是0或1中的乙個。他被允許做如下的一次操作 他選擇乙個起點i,乙個終點j,保證1 i j n,然後將區間中的每乙個數翻轉。翻轉指將ax的值設定為1 ax。問 翻轉一次後,最多有幾個1.題解 字首和優化 ...
hdu 4597 dp 字首和 記憶化搜尋
dp i i len1 j j len2 sum i len1 i j j len2 min 因為每個人都足夠聰明,所以每個人作為先手時都會保證自己會得到最大受益,所以當前狀態下的最大收益就是區間總和減去轉換來的狀態裡收益最小的以獲得最大的收益,有一點博弈的思想,故用四維的陣列記錄狀態,然後用記憶化...
HDU 1024 簡單dp 滾動陣列 字首和
要求 n個數分為m個不相交的區間,求m個區間內所有數的和。方法 動態規劃裸題 滾動陣列 1.根據題意,dp i j 表示前j個數分為i組且用了第j個數的最大值。第j個數要麼是加入第i個組 隱藏含義是加入第j 1個數的組 或者自成第i組,故dp i j max i 1 k j 1 2.要求dp i j...