BJOI2019 排兵布陣 DP

2022-05-03 18:57:09 字數 804 閱讀 7049

題目大意:有$n$座城堡,$s$輪遊戲。

對於第$x$輪,第i座城堡的士兵數量為$a[x][i]$。

如果你需要攻下第i座城堡,你在第i座城堡部署的士兵必須嚴格大於$2a[x][i]$,如果攻下了你會獲得$i$的收益。

對於這$s$輪遊戲,你只能採用一種部署方式。

下面問你應該如何部署,使得你在這$s$輪遊戲中的收益和最大。

資料範圍:$n,s≤100$,$m≤2000$。

我們考慮直接$dp$,設$f[i][j]$表示前$i$個城堡部署了$j$名士兵的最大收益。

不難發現,$f[i][j]=\max\limits_ f[i-1][j-k]+val[i][k]$。

其中,$val[i][k]$表示你在第$i$城堡部署$k$個人的收益和。

直接$dp$就可以了,複雜度為$o(nms)$。

1 #include2

#define m 105

3#define n 20005

4using

namespace

std;56

int f[m][n]=,a[m][m]=,val[m][m]=;

7int

s,n,m;89

intmain()19}

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

21for(int j=0;j<=m;j++)27}

28int maxn=0;29

for(int i=1;i<=m;i++)

30 maxn=max(maxn,f[n][i]);

31 cout32 }

BJOI2019 排兵布陣 DP

比較好想的dp,設 dp i j 表示第 i 個城堡時,已派出 j 個士兵。決策時,貪心派出恰好嚴格大於某一玩家派出的數量的兩倍 不然浪費 我們發現又可以排序預處理出 a i j 表示第 i 個城堡,出兵數量第 j 大的人出兵數量 因為這樣可以很容易算出貢獻,即為 k times i dp轉移方程即...

BJOI2019 排兵布陣 DP

題目大意 有 n 座城堡,s 輪遊戲。對於第 x 輪,第i座城堡的士兵數量為 a x i 如果你需要攻下第i座城堡,你在第i座城堡部署的士兵必須嚴格大於 2a x i 如果攻下了你會獲得 i 的收益。對於這 s 輪遊戲,你只能採用一種部署方式。下面問你應該如何部署,使得你在這 s 輪遊戲中的收益和最...

BJOI2019 排兵布陣

今天比賽上這道題好像是人均題呀。好吧,就乙個簡單的,連優化都不需要的揹包dp。我們每次只需要處理在比第i個城堡的第j大的玩家大的情況,不必把所有的兵的情況都處理完。然後就可以 include include include include include include include includ...