百练 2766 最大子矩阵 【思维 + dp思想】

传送门
//题意就不多说了.
//思想:既然是矩阵, 那么是对称的. 所以我们可以把一个二维的看成两行的数相加,压成一维的, 那么要找最大的矩阵和, 其实就是在一维中找最大连续和. 这样出来的答案就是我们要的. 所以枚举出每一种可能O(n^3)的复杂度. 注意res的初始值不要赋0, 因为最后答案可能是负数.

/** @Cain*/
const int maxn=1e2+5;
int a[maxn][maxn];
int dp[maxn];
int getMax(int *dp,int n)  //算一个序列中最大连续和是多少.
{
    int tmp = 0,ans = dp[0]; 
 //像这种最后答案可能是负数的,最大(小)值不好弄,就赋成其中一个值就好了.
    for(int i=0;iif(tmp > 0) tmp += dp[i];
        else tmp = dp[i];
        ans = max(ans,tmp);
    }
    return ans;
}

void solve()
{
    int n;
    while(~scanf("%d",&n)){
        Fill(a,0);
        for(int i=0;ifor(int j=0;j"%d",&a[i][j]);
            }
        }
        int res = a[0][0];  //注意下.
        for(int i=0;i0);
            for(int j=i;jfor(int k=0;k"%d\n",res);
    }
}

你可能感兴趣的:(dp思维)