fij表示选到前 i 座城堡已经用了j个士兵所能获得总分的最大值。倘若直接枚举每座城堡派几个士兵效率是 O(nm^2),但是我们发现只有多获胜一个人才能使总分增多,所以我们可以考虑枚举每座城堡赢几个人,效率变成O(nms)。
代码:
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=110,M=20010; int a[N][N]; int s,n,m,f[M]; int main () { scanf("%d%d%d",&s,&n,&m); for(int i=1; i<=s; i++) for(int j=1; j<=n; j++) { scanf("%d",&a[j][i]); a[j][i]=a[j][i]*2+1; } 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-1; j>=0; j--) for(int k=1; k<=s; k++) { if(a[i][k]+j>m) break; f[a[i][k]+j]=max(f[a[i][k]+j],f[j]+k*i); } int ans=0; for(int i=1; i<=m; i++) ans=max(ans,f[i]); printf("%d\n",ans); return 0; }
原文:https://www.cnblogs.com/mysh/p/11456531.html