T1.5838. 旅游路线
首先想到O(n^4)枚举两个点,用前缀和算,但是200会T。
考虑枚举一条扫描线,这是O(n^2)的,扫描用O(n),就可以了。
当前和已经小于0,就可以舍去了。
#include<iostream> #include<cstdio> using namespace std; inline int rd(){ int ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f; } const int MAXN=256; int n,m; int a[MAXN][MAXN]; int s[MAXN][MAXN]; int main(){ n=rd();m=rd(); for(register int i=1;i<=n;i++){ for(register int j=1;j<=m;j++){ a[i][j]=rd(); } } for(register int i=1;i<=n;i++){ for(register int j=1;j<=m;j++){ s[i][j]=s[i][j-1]+a[i][j]; } } long long ans=0; for(register int i=1;i<=m;i++){ for(register int j=1;j<=i;j++){ long long tmp=0; for(register int k=1;k<=n;k++){ tmp+=1ll*s[k][i]-s[k][j-1]; ans=max(ans,tmp); if(tmp<0) tmp=0;// } } } printf("%lld\n",ans); return 0; }