题解 P2096 【最佳旅游线路】

· · 题解

原题在此

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。