[BJOI2019]排兵布阵

思博题

大力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;
}
上一篇:[BJOI2019省内集训]完美塔防 题解


下一篇:[BJOI2019]总结