标签:
最大子矩阵可转化为最打子序列问题,最长子序列可以这样做:
设a[N],则a[N]的最大子序列有两种可能(1)一直连续到a[i]。(2)从a[i]开始 。(如果不包括a[i]则之前已经算好,不用管)。则可以利用这个循环来求最大子序列
int maxl(int n) { int ans=-1e9,s=0; for(int i=1;i<=n;i++){ s=max(s+b[i],b[i]); if(s>ans){ ans=s; } } return ans; }
完整代码
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int num[110][110]; int b[110]; int maxl(int n) { int ans=-1e9,s=0; for(int i=1;i<=n;i++){ s=max(s+b[i],b[i]); } return ans; } void compute(int n) { int ans=-1e9; for(int i=1;i<=n;i++){ memset(b,0,sizeof(b)); for(int j=i;j<=n;j++){ for(int k=1;k<=n;k++){ b[k]+=num[j][k]; } int ret=maxl(n); if(ret>ans){ ans=ret; } } } printf("%d\n",ans); } int main() { int n; while(~scanf("%d",&n)){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&num[i][j]); } } compute(n); } return 0; }
标签:
原文地址:http://www.cnblogs.com/Scale-the-heights/p/4322254.html