题解 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。