题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081
思路:其实就是化二维为一维,可以把有相同行数的每一列的最大值求出来就可以了,每次都更新就行了。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 const int N=110; 3 const int inf=1000000000; 4 using namespace std; 5 6 int num[N][N]; 7 int dp[N]; 8 9 int main(){ 10 int n; 11 while(~scanf("%d",&n)){ 12 for(int i=0;i<n;i++){ 13 for(int j=0;j<n;j++){ 14 scanf("%d",&num[i][j]); 15 } 16 } 17 int ans=-inf; 18 for(int i=0;i<n;i++){ 19 memset(dp,0,sizeof(dp)); 20 for(int j=i;j<n;j++){ 21 int sum=-1; 22 //每列中的元素相加 23 for(int k=0;k<n;k++){ 24 dp[k]+=num[j][k]; 25 } 26 //求和最大的那列 27 for(int k=0;k<n;k++){ 28 sum=sum<0?dp[k]:sum+dp[k]; 29 if(sum>ans)ans=sum; 30 } 31 } 32 } 33 printf("%d\n",ans); 34 } 35 return 0; 36 }