题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1081
题目是求矩阵中存在的最大子矩阵的和。刚开始吧题目理解错了,以为一定包括矩阵的四个角,错了后才发现里面的也可以。后来看了别人的结题报告 - -。
这道题就是求连续子序列的,只要把一维度变成二维度就行了。
一维度:
for (int i = 1; i <= n; i++){
max = max + a[i] > a[i] ? max + a[i]: a[i];
maxx = max > max ? maxx : max;
}
首先把a[i][j]表示成第i行第j个数以前的和,则例如 :i行k到j的和为a[i][j]-a[i][k-1];
只要在一维度上加两个循环,k代表行数。
for (int i = 1; i <= n; i++){
for (int j = i; j <= n; j++){
max = -500;
for (int k = 1; k <= n; k++){
max = (a[k][j] - a[k][i - 1]) > (max + a[k][j] - a[k][i - 1]) ? (a[k][j] - a[k][i - 1]) : (max + a[k][j] - a[k][i - 1]);
maxx = max > maxx ? max : maxx;
}
}
}
代码:
#include<iostream>
using namespace std;
int a[105][105],dp[105][105];
int main(){
int n,k,temp,max;
while (cin >> n){
int maxx = -500;
memset(a, 0, sizeof(a));
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
cin >> temp;
a[i][j] =a[i][j-1] + temp;
}
}
//i到j a[i][]
for (int i = 1; i <= n; i++){
for (int j = i; j <= n; j++){
max = -500;
for (int k = 1; k <= n; k++){
max = (a[k][j] - a[k][i - 1]) > (max + a[k][j] - a[k][i - 1]) ? (a[k][j] - a[k][i - 1]) : (max + a[k][j] - a[k][i - 1]);
maxx = max > maxx ? max : maxx;
}
}
}
cout << maxx << endl;
}
}