4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
15
算法:最小子列和比较简单,二维问题可以通过枚举一个i,j降为一维问题。
代码:
#include <iostream> #include <algorithm> #include <stdlib.h> #include <string.h> using namespace std; int dp[110]; int m[110][110]; int PreSum[110][110]; int ary[110]; int n; int Result; bool Input(); void Caculate(); int GetDp(); int main(){ while(cin>>n){ Input(); Caculate(); cout<<Result<<endl; } } bool Input(){ memset(PreSum, 0, sizeof(PreSum)); for(int i = 0; i < n; ++i){ for(int j = 1; j <= n; ++j){ cin>>m[i][j]; PreSum[i][j] = PreSum[i][j-1] + m[i][j]; } } return true; } void Caculate(){ Result = -0x0FFFFFFF; for(int i =0; i <= n; ++i){ for(int j = i + 1; j <= n; ++j){ for(int l = 0; l < n; ++l){ ary[l] = PreSum[l][j] - PreSum[l][i]; } Result = max(Result, GetDp()); } } } int GetDp(){ memset(dp, 0, sizeof(dp)); dp[0] = ary[0]; for(int i = 1; i < n; ++i){ dp[i] = max(dp[i-1] + ary[i], ary[i]); } return *max_element(dp, dp + n); }结果:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
15822302 | 2015-12-11 21:45:43 | Accepted | 1081 | 31MS | 1888K | 963 B | C++ | BossJue |