分组背包
题目链接
思路
发现因为策略不变,所以当第
j
j
j个人的第
i
i
i个城堡被攻占时,所有对第
i
i
i个城堡出兵数量小于第
j
j
j个人的都会被攻占
现在我们可以用上面的结论推翻
s
s
s轮对做题的限制,让每个城堡作为一组,每组里有
s
s
s个玩家
为了方便计算增加的分数,我们需要给每个城堡排序
ACcode
#include<bits/stdc++.h>
using namespace std;
const int M = 2e4 + 9;
int dp[M], a[M][M];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int s, n, m;cin >> s >> n >> m;
for (int i = 1;i <= s;i++)
for (int j = 1;j <= n;j++)
cin >> a[j][i];//第i个玩家的第j个城堡
for (int i = 1;i <= n;i++)
sort(a[i] + 1, a[i] + 1 + s);
for (int i = 1;i <= n;i++)//城堡
for (int j = m;j >= 0;j--)
for (int k = 1;k <= s;k++)//每个玩家
if (j > a[i][k] * 2)dp[j] = max(dp[j], dp[j - a[i][k] * 2 - 1] + i * k);
int ans = 0;
for (int i = 0;i <= m;i++)ans = max(ans, dp[i]);
cout << ans;
return 0;
}