比較好想的dp,設\(dp[i][j]\)表示第\(i\)個城堡時,已派出\(j\)個士兵。決策時,貪心派出恰好嚴格大於某一玩家派出的數量的兩倍(不然浪費)。我們發現又可以排序預處理出\(a[i][j]\)表示第\(i\)個城堡,出兵數量第\(j\)大的人出兵數量(因為這樣可以很容易算出貢獻,即為\(k\times i\))
dp轉移方程即為:
\[dp[j]=max(dp[j-a[i][k]*2-1]+k*i, dp[j]);
\]ac code:
#include #include #define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int s,n,m,dp[20002],a[110][110],ans;
signed main()
/* dp[i][j]第i個城堡時,已派出j個士兵
a[i][j]第i個城堡,第j個人出的兵
*/
BJOI2019 排兵布陣 DP
題目大意 有 n 座城堡,s 輪遊戲。對於第 x 輪,第i座城堡的士兵數量為 a x i 如果你需要攻下第i座城堡,你在第i座城堡部署的士兵必須嚴格大於 2a x i 如果攻下了你會獲得 i 的收益。對於這 s 輪遊戲,你只能採用一種部署方式。下面問你應該如何部署,使得你在這 s 輪遊戲中的收益和最...
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...