ny104 最大和

本文介绍了一种解决二维矩阵最大子矩阵求和问题的方法,通过将每一行视为子串进行最大和处理,实现对二维矩阵中所有可能子矩阵求和并找到最大值。

最大和

时间限制:1000 ms  |  内存限制:65535 KB
难度:5
描述

给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。 
例子:
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
其最大子矩阵为:

9 2 
-4 1 
-1 8 
其元素总和为15。 

输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;
输出
输出矩阵的最大子矩阵的元素之和。
样例输入
1
4 4
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
样例输出

15

讲解:考虑本题时,要把每一行都当成子串的最大和来处理,这样得到的就是最优解了

具体AC代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 int map[102][102];
 4 int main()
 5 {
 6     int i,j,k,m,t,r,c,max,temp;
 7     scanf("%d",&t);
 8     while(t--)
 9     {memset(map,0,sizeof(map));
10         scanf("%d%d",&r,&c);
11         for(i=1;i<=r;i++)
12         {
13             for(j=1;j<=c;j++)
14             {
15                 scanf("%d",&map[i][j]);
16                 map[i][j]=map[i][j]+map[i-1][j];//先得到每一列的前n项和
17             }
18         }
19         for(i=1,m=map[1][1];i<=r;i++)
20             for(j=i;j<=r;j++)
21             {max=0;
22                 for(k=1;k<=c;k++)
23                 {
24                     temp=map[j][k]-map[i-1][k];//从最后一列依次从上向下减
25                     max=(max>=0?max:0)+temp;//取当前列的最大子串和
26                     m=max>m?max:m;//保存到m中
27                 }
28             }
29         printf("%d\n",m);
30     }
31     return 0;
32 }

 

 

 

 

1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 % PHASE-FIELD FINITE-DIFFRENCE % % CODE FOR % 3 % DENDRITIC SOLIDIFICATION % 4 % (OPTIMIZED FOR MATLAB/OCTAVE) % 5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 7 %== get initial wall time: 8 time0=clock(); 9 format long; 10 11 %-- Simulation cell parameters: 12 13 Nx = 300; 14 Ny = 300; 15 NxNy= Nx*Ny; 16 17 dx = 0.03; 18 dy = 0.03; 19 20 %--- Time integration parameters: 21 22 nstep = 4000; 23 nprint = 50; 24 dtime = 1.e-4; 25 26 %--- Material specific parameters: 27 28 tau = 0.0003; 29 epsilonb = 0.01; 30 mu = 1.0; 31 kappa = 1.8; 32 delta = 0.02; 33 aniso = 6.0; 34 alpha = 0.9; 35 gamma = 10.0; 36 teq = 1.0; 37 theta0 = 0.2; 38 seed = 5.0; 39 % 40 pix=4.0*atan(1.0); 41 42 %--- Initialize and introduce initial nuclei: 43 44 [phi,tempr] = nucleus(Nx,Ny,seed); 45 46 %--- Laplacian templet: 47 48 [laplacian] =laplacian(Nx,Ny, dx,dy); 49 50 %--- 51 %--- Evolution 52 %--- 53 54 for istep =1:nstep 55 56 phiold =phi; 57 58 %--- 59 % calculate the laplacians and epsilon: 60 %--- 61 62 phi2 = reshape(phi’,NxNy,1); 63 64 lap_phi2 = laplacian*phi2; 65 66 [lap_phi]=vec2matx(lap_phi2,Nx); 67 68 %-- 69 70 tempx = reshape(tempr’,NxNy,1); 71 72 lap_tempx =laplacian*tempx; 73 74 [lap_tempr] =vec2matx (lap_tempx,Nx); 75 76 %--gradients of phi: 77 78 [phidy,phidx]=gradient_mat (phi,Nx,Ny,dx,dy); 79 80 %-- calculate angle: 81 82 theta =atan2(phidy,phidx); 83 84 %--- epsilon and its derivative: 85 86 epsilon = epsilonb*(1.0+delta* cos(aniso*(theta-theta0))); 87 88 epsilon_deriv = -epsilonb*aniso* delta*sin(aniso.*(theta-theta0)); 89 90 %--- first term: 91 92 dummyx =epsilon.*epsilon_deriv. *phidx; 93 94 [term1,dummy] =gradient_mat (dummyx,Nx,Ny,dx,dy); 95 96 %--- second term: 97 98 dummyy =-epsilon.*epsilon_deriv. *phidy; 99 100 [dummy,term2] =gradient_mat (dummyy,Nx,Ny,dx,dy); 101 102 %--- factor m: 103 104 m =(alpha/pix)*atan(gamma* (teq-tempr)); 105 106 %-- Time integration: 107 108 phi = phi +(dtime/tau) *(term1 + term2 + epsilon.^2 .* lap_phi + ... 109 phiold.*(1.0-phiold).* (phiold - 0.5 + m)); 110 111 112 %-- evolve temperature: 113 114 tempr = tempr + dtime*lap_tempr + kappa*(phi-phiold); 115 116 117 %---- print results 118 119 if(mod(istep,nprint) == 0 ) 120 121 fprintf(’done step: %5d\n’,istep); 122 123 %fname1 =sprintf(’time_%d.out’, istep); 124 %out1 = fopen(fname1,’w’); 125 126 %for i=1:Nx 127 %for j=1:Ny 128 %ii=(i-1)*Nx+j; 129 %fprintf(out1,’%5d %5d %14.6e %14.6e \n’,i,j,phi(i,j),tempr(i,j)) 130 %end 131 %end 132 133 %fclose(out1) 134 135 %--- write vtk file: 136 137 write_vtk_grid_values(Nx,Ny,dx,dy, istep,phi,tempr); 138 139 end %if 140 141 end %istep 142 143 %--- calculate compute time: 144 145 compute_time = etime(clock(), time0); 146 fprintf(’Compute Time: %10d\n’, compute_time); 147 在这个代码的基础上改,完成底部多晶粒枝晶生长的代码,分辨率高点
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值