题意:
求n*n矩阵子矩阵,使他的和最大。
这题是一个最大子序列和的一个变形,我们可以将每个子矩阵的序列表示出来,再求子矩阵序列的最大子序列和。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int n,map[101][101];
int a[101];
int find_max()
{
int dp[101],i,max=-10000000000;
memset(dp,0,sizeof(dp));
dp[0]=a[0];
for(i=1;i<n;i++)
{
if(dp[i-1]>0)
{
dp[i]=dp[i-1]+a[i];
}
else
{
dp[i]=a[i];
}
if(max<dp[i])
max=dp[i];
}
return max;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,j,k=0,l,sum=0,max=-10000000000,t;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
}
for(i=1;i<=n;i++)
{
memset(a,0,sizeof(a));
for(l=0;l<n-i;l++)
{
for(j=0;j<n;j++)
{
sum=0;
for(k=l;k<l+i;k++)
{
sum+=map[j][k];
}
a[j]=sum;
}
t=find_max();
if(t>max)
max=t;
}
}
printf("%d\n",max);
}
return 0;
}
注意:其中的max初始化的时候不能=0,因为子序列里有负数。
就是因为这个原因我WA了两次。
总结:
在以后遇到min,max等的初始化的时候可以将max赋值为整型最小,min赋值为整型最大,避免出错。
其实这题目可以互相转换的,要举一反三,,,但是谈何容易!!!