题目:
最大子矩阵
Time Limit: 30000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1367 Accepted Submission(s): 721
14 5 2 23 361 649 676 588992 762 156 993 169662 34 638 89 543525 165 254 809 280
2474
本题是一个最大子序列的简化版 给定了子阵的行数和列数
所以基本都不是动态规划了~~~
源代码:
#include<iostream>
using namespace std;
int a[1100][1100];//输入数组
int s[1100][1100];//每行从开始到每个位置的和
int main()
{
int m,n,x,y;
int t;
cin>>t;
while(t--)
{
cin>>m>>n>>x>>y;
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>a[i][j];
if(j==0)/计算每行从开始至j的和
{
s[i][j]=a[i][j];
}
else
{
s[i][j]=s[i][j-1]+a[i][j];
}
}
}
int res=0;
for(i=0;i<n-y+1;i++)/计算从i开始的y列的最大子序列和
{
int sum=0;
for(j=0;j<x;j++)
{
if(i>0)
{
sum+=(s[j][i+y-1]-s[j][i-1]);
}
else
{
sum+=s[j][i+y-1];
}
}
if(sum>res)
{
res=sum;
}
for(;j<n;j++)
{
if(i>0)
{
sum+=(s[j][i+y-1]-s[j][i-1]);
sum-=(s[j-x][i+y-1]-s[j-x][i-1]);
}
else
{
sum+=(s[j][i+y-1]);
sum-=(s[j-x][i+y-1]);
}
if(sum>res)
{
res=sum;
}
}
}
cout<<res<<endl;
}
return 0;
}