P5322
状态表示
\[dp[i]表示主人公出动i名士兵获得的分数
\]
转移
-
将输入数组进行排序,使得 \(in[i][j]\) 表示对于第 \(i\) 座城堡,出动兵力第 \(j\) 小的玩家的士兵数
-
这样做,如果主人公能在 \(i\) 城堡打败第 \(j\) 个人,将获得 \(i \times j\) 分
\[dp[j]=max(dp[j-in[i][k]*2-1]+i*k,dp[j])
\]
-
因为要严格大于对方的两倍,所以要 \(j-in[i][k]*2-1\)
-
求最大值时要枚举每一个出兵数
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF=1e9;
const int N=110;
int s,n,m;
int in[110][110],dp[20010],maxi;
signed main(){
// freopen("1.in","r",stdin);
cin>>s>>n>>m;
for(int i=1;i<=s;i++){
for(int j=1;j<=n;j++)
cin>>in[j][i];
}
for(int i=1;i<=n;i++)
sort(in[i]+1,in[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>=in[i][k]*2+1) dp[j]=max(dp[j-in[i][k]*2-1]+i*k,dp[j]);
}
}
for(int i=0;i<=m;i++)
maxi=max(maxi,dp[i]);
cout<<maxi<<"\n";
}
浙公网安备 33010602011771号