http://acm.hdu.edu.cn/showproblem.php?pid=1081
题意:在一个有正负数的矩阵当中找一个子矩阵,使得这个子矩阵的sum最大,所谓sum就是子矩阵中所有数字的和。
思路:刚看到题目的时候觉的像是dp,因为以前做过类似的在矩阵中找最大正方形的题目,觉得是二维dp,又想到对于一个数,如何判断它是否应该存在于一 个矩阵当中,不仅涉及行,还涉及到列,而且还要搞的和最大,因为队友问过我那个hdu的1003题,那个题,我早以前做的时候其实也没理解透,后来又给他 讲了一遍,感觉这个题差不多就是那个的二维版本。
下面是代码:
View Code
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; const int maxn=105; int num[maxn][maxn],link[maxn]; int ma,n; void data_in() { memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) scanf("%d",&num[i][j]); } } void cal() { int ans=0; for(int i=1;i<=n;i++) { ans+=link[i]; if(ma<ans) ma=ans; if(ans<0) ans=0; } } void solve() { ma=-128; for(int i=1;i<=n;i++) { memset(link,0,sizeof(link)); for(int j=i;j<=n;j++) { for(int k=1;k<=n;k++) link[k]+=num[j][k]; cal(); } } } int main() { while(~scanf("%d",&n)) { data_in(); solve(); cal(); printf("%d\n",ma); } return 0; }
善待每一天,努力做好自己。
欢迎转载,注明出处。