hdu1559——最大子矩阵

本文介绍了一个基于DP(动态规划)的算法实现,并针对特定问题进行了优化。通过两次循环计算子矩阵的最大和,首次实现较为直接但运行较慢,随后通过减少重复计算进一步优化算法,显著提升了运行效率。

DP问题!参照最大矩阵和,应该可以自己搞出来的!

#include<stdio.h> #include<string.h> __int64 g[1005][1005],max[1005][1005],map[2][1005]; int main() { int t,i,n,m,x,j,y,k; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&m,&n,&x,&y); for(i=1;i<=m;i++) for(j=1;j<=n;j++) scanf("%I64d",&g[i][j]); memset(map,0,sizeof(map)); memset(max,0,sizeof(max)); __int64 smax=0,submax=0; for(i=1;i<=m-x+1;i++) { for(j=i;j<i+x;j++) { for(k=1;k<=n;k++) max[j+1][k]=max[j][k]+g[j][k]; } submax=0; for(k=1;k<=y;k++) submax+=max[i+x][k]-max[i][k]; if(smax<submax) smax=submax; int tt=1; for(k=y+1;k<=n;k++) { submax+=max[i+x][k]-max[i][k]; submax-=max[i+x][tt]-max[i][tt]; if(submax>smax) smax=submax; tt++; } if(submax>smax) smax=submax; } printf("%I64d\n",smax); } }

改进了下,快了将近200ms,但还是很慢,500ms+ 囧!

#include<stdio.h> #include<string.h> __int64 g[1005][1005],max[1005][1005],map[2][1005]; int main() { int t,i,n,m,x,j,y,k; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&m,&n,&x,&y); for(i=1;i<=m;i++) for(j=1;j<=n;j++) scanf("%I64d",&g[i][j]); memset(map,0,sizeof(map)); memset(max,0,sizeof(max)); __int64 smax=0,submax=0; for(i=1;i<=m-x+1;i++) { for(j=i;j<i+x;j++) { for(k=1;k<=n;k++) max[j+1][k]=max[j][k]+g[j][k]; } for(k=1;k<=n;k++) map[0][k]=max[i+x][k]-max[i][k]; for(k=1;k<=n;k++) map[0][k]+=map[0][k-1]; int tt=0; for(k=y;k<=n;k++) { if(map[0][k]-map[0][tt]>smax) smax=map[0][k]-map[0][tt]; tt++; } } printf("%I64d\n",smax); } }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值