13-14寒假作业3
2014-03-03 20:05
274 查看
poj 1050
输入一个矩阵,求出这个矩阵中数字之和最大的小矩阵的和是多少。
开始没有注意到数据量比较小,还以为是什么神算法。后来看到100*100的数据,于是暴力做过掉。
枚举小矩阵的宽度,对长度进行dp求最子字串就可以了。区间和用前缀和来记录,代码敲起来还有点讨厌- -
#include<cstdio>
#include<cstring>
int a[110][110],sum[110][110];
int b[110][110][110];
int main()
{
// freopen("data.in","r",stdin);
int N,i,j,p,ans;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
scanf("%d",&N);
for(i=0;i<N;++i)
for(j=0;j<N;++j)
{
scanf("%d",&a[i][j]);
if(j>=1)
sum[i][j]=sum[i][j-1]+a[i][j];
else sum[i][j]+=a[i][j];
}
for(i=0;i<N;++i)
{
for(j=N-1;j>=i;j--)
{
b[i][j][0]=sum[0][j]-sum[0][j-i]+a[0][j-i];
for(p=1;p<N;++p)
{
if(b[i][j][p-1]+sum[p][j]-sum[p][j-i]+a[p][j-i]>0&&b[i][j][p-1]>0)
b[i][j][p]+=(sum[p][j]-sum[p][j-i]+a[p][j-i]+b[i][j][p-1]);
else if(b[i][j][p-1]+sum[p][j]-sum[p][j-i]+a[p][j-i]>0&&b[i][j][p-1]<=0)
b[i][j][p]=sum[p][j]-sum[p][j-i]+a[p][j-i];
else if(b[i][j][p-1]+sum[p][j]-sum[p][j-i]+a[p][j-i]<=0)
b[i][j][p]=sum[p][j]-sum[p][j-i]+a[p][j-i];
}
}
}
ans=-130;
for(i=0;i<N;++i)
for(j=N-1;j>=i;j--)
// printf("!%d\n",b[i][j][1]);
for(p=0;p<N;++p)
if(b[i][j][p]>ans)
ans=b[i][j][p];
printf("%d\n",ans);
return 0;
}
输入一个矩阵,求出这个矩阵中数字之和最大的小矩阵的和是多少。
开始没有注意到数据量比较小,还以为是什么神算法。后来看到100*100的数据,于是暴力做过掉。
枚举小矩阵的宽度,对长度进行dp求最子字串就可以了。区间和用前缀和来记录,代码敲起来还有点讨厌- -
#include<cstdio>
#include<cstring>
int a[110][110],sum[110][110];
int b[110][110][110];
int main()
{
// freopen("data.in","r",stdin);
int N,i,j,p,ans;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
scanf("%d",&N);
for(i=0;i<N;++i)
for(j=0;j<N;++j)
{
scanf("%d",&a[i][j]);
if(j>=1)
sum[i][j]=sum[i][j-1]+a[i][j];
else sum[i][j]+=a[i][j];
}
for(i=0;i<N;++i)
{
for(j=N-1;j>=i;j--)
{
b[i][j][0]=sum[0][j]-sum[0][j-i]+a[0][j-i];
for(p=1;p<N;++p)
{
if(b[i][j][p-1]+sum[p][j]-sum[p][j-i]+a[p][j-i]>0&&b[i][j][p-1]>0)
b[i][j][p]+=(sum[p][j]-sum[p][j-i]+a[p][j-i]+b[i][j][p-1]);
else if(b[i][j][p-1]+sum[p][j]-sum[p][j-i]+a[p][j-i]>0&&b[i][j][p-1]<=0)
b[i][j][p]=sum[p][j]-sum[p][j-i]+a[p][j-i];
else if(b[i][j][p-1]+sum[p][j]-sum[p][j-i]+a[p][j-i]<=0)
b[i][j][p]=sum[p][j]-sum[p][j-i]+a[p][j-i];
}
}
}
ans=-130;
for(i=0;i<N;++i)
for(j=N-1;j>=i;j--)
// printf("!%d\n",b[i][j][1]);
for(p=0;p<N;++p)
if(b[i][j][p]>ans)
ans=b[i][j][p];
printf("%d\n",ans);
return 0;
}
相关文章推荐
- oracle--执行计划
- Part 5. Templates and Generic Programming
- JSTL自定义标签一简单的例子
- GridView
- hdu 1002 要用数组计算,错了n次!!!
- 语音识别中的置信度问题
- unicode 的体会
- 使用Latex制作简历
- oracle索引之--count(*)优化
- 【Android】屏幕适配——屏幕规格与分辨率对照表
- SAS学习笔记(七)——关于异常值处理
- for in 循环
- Matlab判断小数有多少位
- RBM训练指导手册粗略(A Practical Guide to Training Restricted Boltzmann Machines)
- 有一个整数数组,请求出两两之差绝对值最小的值
- SQL中Group By的使用
- 第一周(春)项目二 胖纸伤不起
- MyEclipse经常弹出An internal error occurred during: "HTML Syntax Validator". 处理办法
- lucene学习笔记:三,Lucene的索引文件格式
- HDU1385 Minimum Transport Cost