网址如下:
OpenJudge - 2766:最大子矩阵
用dp来做就行了
代码如下(MLE):
#include<cstdio>
const int maxn = 101;
int dp[maxn][maxn][maxn][maxn];
int martix[maxn][maxn];
int N, ans;
int main(void)
{
scanf("%d", &N);
//输入
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
scanf("%d", &martix[i][j]);
//dp
ans = martix[1][1];
for(int x1 = 1; x1 <= N; x1++)
for(int y1 = 1; y1 <= N; y1++)
for(int x2 = x1; x2 <= N; x2++)
for(int y2 = y1; y2 <= N; y2++){
dp[x1][y1][x2][y2] = dp[x1][y1][x2 - 1][y2] + dp[x1][y1][x2][y2 - 1] - dp[x1][y1][x2 - 1][y2 - 1] + martix[x2][y2];
ans = ans > dp[x1][y1][x2][y2] ? ans : dp[x1][y1][x2][y2];
}
printf("%d", ans);
return 0;
}
虽然内存爆了,但是这个更容易看懂
代码如下(AC):
#include<cstdio>
#include<vector>
const int maxn = 101;
std::vector<std::vector<int>> dp[maxn][maxn];
int martix[maxn][maxn];
int N, ans;
int main(void)
{
scanf("%d", &N);
//输入
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
scanf("%d", &martix[i][j]);
//dp
ans = martix[1][1];
for(int x1 = 1; x1 <= N; x1++)
for(int y1 = 1; y1 <= N; y1++){
dp[x1][y1].resize(N - x1 + 2);
dp[x1][y1][0].resize(N - y1 + 2, 0);
for(int x2 = 1; x2 <= N - x1 + 1; x2++){
dp[x1][y1][x2].resize(N - y1 + 2, 0);
for(int y2 = 1; y2 <= N - y1 + 1; y2++){
dp[x1][y1][x2][y2] = dp[x1][y1][x2 - 1][y2] + dp[x1][y1][x2][y2 - 1] - dp[x1][y1][x2 - 1][y2 - 1] + martix[x1 + x2 - 1][y1 + y2 - 1];
ans = ans > dp[x1][y1][x2][y2] ? ans : dp[x1][y1][x2][y2];
}
}
dp[x1][y1].clear();
}
printf("%d", ans);
return 0;
}
这个是把内存压下来的代码,dp公式一样,只不过看起来比较复杂