最大子矩阵(贪心)
虽然我写的是贪心
但这个题哪有贪心的感觉
感觉无从可贪
折磨了我好久之后
我从一篇别人的博客上
受到了启发
类似几何的割补法
将矩阵的行的和算出来
然后再作差比较
得出一块矩阵
在比较之前算出的矩阵权值
看是否大于零,大于零就添上,小于零就舍去
然后进行枚举
然后这个题的核心就差不多了
#include<iostream> #include<cstdio> using namespace std; int N[105][105]; int maxn=-1e3; int main() { int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>N[i][j]; N[i][j]+=N[i-1][j]; } for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { int ans=0; for(int l=1;l<=n;l++) { ans=N[j][l]-N[i-1][l]+max(0,ans); maxn=max(ans,maxn); } } cout<<maxn; }
一个细节务必务必务必记得——
maxn初值不能为零,不能为零,不能为零
(就因为这个,几次都没过)