不知道0ms思路是咋样的,偶滴代码15ms……
就是转换成一维数组,然后求最大子序列和……
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 4 int n; 5 int inp[105][105]; 6 int temp[105][105]; 7 8 int get_sum(int t[]) 9 { 10 int dp[105]; 11 12 dp[0]= t[0]; 13 for(int i = 1;i < n;i ++) 14 { 15 if(dp[i-1]>= 0) 16 dp[i] = dp[i-1] + t[i]; 17 else 18 dp[i] = t[i]; 19 } 20 int ans = dp[0]; 21 for(int i = 1;i < n;i ++) 22 { 23 if(ans < dp[i]) 24 ans = dp[i]; 25 } 26 27 return ans; 28 } 29 30 int main() 31 { 32 while(scanf("%d",&n) == 1) 33 { 34 for(int i = 0;i < n;i ++) 35 { 36 for(int j = 0;j < n;j ++) 37 { 38 scanf("%d",&inp[i][j]); 39 temp[i][j] = inp[i][j]; 40 } 41 } 42 43 int ans = get_sum(inp[0]); 44 for(int i = 1;i < n;i ++) 45 { 46 int num = get_sum(inp[i]); 47 if(ans < num) 48 ans = num; 49 } 50 51 for(int i = 1;i < n;i ++) 52 { 53 for(int j = 0;j < n - i;j ++) 54 { 55 for(int k = 0;k < n;k ++) 56 { 57 inp[j][k] += temp[j+i][k]; 58 } 59 int num = get_sum(inp[j]); 60 if(ans < num) 61 ans = num; 62 } 63 } 64 65 printf("%d\n",ans); 66 } 67 68 return 0; 69 }