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

被折叠的 条评论
为什么被折叠?



