1 条题解
-
0
自动搬运
来自洛谷,原作者为

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
- 上传者