1 条题解

  • 0
    @ 2025-8-24 21:33:57

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar enceladus

    搬运于2025-08-24 21:33:57,当前版本为作者最后更新于2018-06-06 18:02:12,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    原题在此


    e,边做题,边写题解,大致读了遍题,是道 贪心 , 那么我们分析一下题,图大概是下面这个样子:


    竖直方向可以随便走嘛,所以求出每一列 的最大值,再做比较就可以了。


    but,命运多舛,交了一遍,80分,有两个点过不了,重读遍题发现:对了,不一定要在最右边结束,也不一定在最左边开始,这点很重要,这才AC了此题。 先上代码


    八十分版

    // luogu-judger-enable-o2
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define ll long long
    #define R register
    #define mmax 20002
    ll n,m,maxx=-0x7fffffff,ans;
    ll tu[102][mmax],da[mmax];
    int main()
    {
        /*freopen(".in","r",stdin);
        freopen(".out","w",stdout);*/
        cin>>m>>n;
        for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        {
        cin>>tu[i][j]; //输入 
        }
        /*for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
        {
        cout<<tu[i][j]<<" "; 
        }*/
        
        for(int i=1;i<=n;i++)
        {
            maxx=-0x7ffffff; 
            for(int j=1;j<=m;j++)
                {
                   if(tu[j][i]>maxx)//注意i和j的顺序 
                   {
                   da[i]=tu[j][i];
                   maxx=tu[j][i];//
                   }
                  
                }
            }
            /*for(int i=1;i<=n;i++)
            {
                cout<<da[i]<<" ";//最大值 
            }*/
            ll qzh1=0,qzh2=0;
            for(int i=1;i<=n;i++)
            {	
                qzh1=qzh2+da[i];
                qzh2=qzh1;
                if(ans<qzh1) ans=qzh1;
            }
            cout<<ans<<endl;
        /*fclose(stdin);
        fclose(stdout);*/
        return 0;
    }
    
    

    一百分版

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define ll long long
    #define II int
    #define R register
    #define mmax 20002
    #define inf 0x7ffffff 
    II n,m,ans;
    II tu[102][mmax],da[mmax];
    II mxsum(II *x){   //最大子串和
        II th=0;
        II mx=0;
        for(R II i=1;i<=n;++i){
            th+=x[i];
            if(th<0)th=0;
            else if(th>mx)mx=th;
        }
        return mx;
    }
    int main()
    {
        /*freopen(".in","r",stdin);
        freopen(".out","w",stdout);*/
        cin>>m>>n;
        for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        {
            cin>>tu[i][j]; //输入 
        }
        for(int i=1;i<=n;i++)
        {
            da[i]=-inf;
            for(int j=1;j<=m;j++) 
               if(tu[j][i]>da[i])//注意i和j的顺序 
               {
               		da[i]=tu[j][i];、、每列最大值
               }
        }
        cout<<mxsum(da)<<endl;
        /*fclose(stdin);
        fclose(stdout);*/
        return 0;
    }
    

    就这样了,好好打,别变棕哟QWQ。

    • 1

    信息

    ID
    1074
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者