思博题
大力dp就行了
\(O(nms)\)
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;const int M=2*1e5+10;
typedef long long ll;const int N=110;
int mp[N][N];int dp[M];int s;int n;int m;
map <int,int> tval;
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",&mp[i][j]);
for(int i=0;i<=m;i++)
dp[i]=-0x3f3f3f3f;
dp[0]=0;
for(int i=1;i<=n;i++)
{
tval.clear();
for(int j=1;j<=s;j++)
tval[mp[j][i]<<1|1]++;
map <int,int> :: iterator it1,it2;
for(it1=tval.begin(),it2=it1,++it2;it2!=tval.end();++it1,++it2)
it2->second+=it1->second;
for(int j=m;j>=0;j--)
if(dp[j]!=-0x3f3f3f3f)
for(map <int,int>:: iterator it=tval.begin();it!=tval.end()&&
it->first+j<=m;++it)
{
// printf("i=%d,it->second=%d\n",i,it->second);
dp[j+it->first]=max(dp[j+it->first],dp[j]+it->second*i);
}
// for(int j=0;j<=m;j++)
// printf("%d ",dp[j]);printf("\n");
}
int ans=0;
for(int i=0;i<=m;i++)
ans=max(ans,dp[i]);
printf("%d",ans);
return 0;
}