[暴力][前缀和] Jzoj P5838 旅游路线
题解
- 先搞一个前缀和,sum[i][j]表示第i行前j个的和
- 那么先O(n^2)枚举一个l和一个r
- 然后再O(n)暴力从上面往下加
- 如果ans<0把ans=0
代码
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 int n,m,a[210][210]; 5 long long sum[210][210],ans,mx; 6 int main() 7 { 8 scanf("%d%d",&n,&m); 9 for (int i=1;i<=n;i++) 10 for (int j=1;j<=m;j++) 11 { 12 scanf("%d",&a[i][j]); 13 sum[i][j]=sum[i][j-1]+a[i][j]; 14 } 15 for (int i=1;i<=m;i++) 16 for (int j=i;j<=m;j++) 17 { 18 ans=0; 19 for (int k=1;k<=n;k++) 20 { 21 ans=ans+sum[k][j]-sum[k][i-1]; 22 mx=max(mx,ans); 23 ans=ans<0?0:ans; 24 } 25 } 26 printf("%lld",mx); 27 return 0; 28 }