题意:给出一串数字,求出其中某段连续的数字之和最大的值,同时要输出起点的位置和终点的位置~~~
方法一:
用sum记录某一段和的值,maxx为目前为止最大的sum值,当sum+a[i]<0时,sum清零,同时更新起点值~,当sum>max时,使max=sum,同时更新要输出的起点值start以及要输出的终点值end~
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int main() 7 { 8 int t,n,cas=0; 9 scanf("%d",&t); 10 while(t--) 11 { 12 cas++; 13 int i,j,sum=0,start=0,endd=0,a,maxx=-12345678,f,e; 14 scanf("%d",&n); 15 for(i=0,f=0,e=0;i<n;i++) 16 { 17 scanf("%d",&a); 18 sum+=a; 19 if(sum>maxx) 20 { 21 maxx=sum; //跟新要输出的最大值,起点值,终点值~ 22 start=f; 23 endd=i; 24 } 25 if(sum<0) 26 { 27 sum=0; //清零~并更新下一组数字的起点值~ 28 f=i+1; 29 } 30 e=i; 31 } 32 printf("Case %d: ",cas); 33 printf("%d %d %d ",maxx,start+1,endd+1); 34 if(t) printf(" "); 35 } 36 return 0; 37 }
//memory:228KB time:0ms
POJ 1050 To the Max
题意:
给出一个矩阵,求出其中最大的子矩阵之和~其实与上题很相似~
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 #define N 110 5 int a[N][N]; 6 int b[N]; 7 int main(){ 8 int n,r; 9 cin>>r; 10 memset(a,0,sizeof(a)); 11 for(int i=1;i<=r;++i) 12 for(int j=1;j<=r;++j) 13 { 14 cin>>a[i][j]; 15 a[i][j]+=a[i-1][j]; 16 } 17 int max=a[1][1]; 18 for(int i=0;i<=r-1;++i) 19 for(int j=i+1;j<=r;++j) 20 { 21 memset(b,0,sizeof(b)); 22 for(int k=1;k<=r;++k) 23 { 24 if(b[k-1]>=0) 25 b[k]=b[k-1]+a[j][k]-a[i][k]; 26 else 27 b[k]=a[j][k]-a[i][k]; 28 if(max<b[k]) 29 max=b[k]; 30 } 31 } 32 cout<<max<<endl; 33 }
//memory:276KB time:32ms
Flying to the Mars
其实就是求排列(从大到小)好的最长上升子序列长度~
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 class A 8 { 9 public: 10 int x,id; 11 }a[3000]; 12 13 bool comp(A k,A y) 14 { 15 return k.x>y.x; 16 } 17 18 int main() 19 { 20 int n; 21 while(~scanf("%d",&n)) 22 { 23 int i,j,number=0,minn; 24 memset(a,0,sizeof(a)); 25 for(i=0;i<n;i++) 26 scanf("%d",&a[i].x); 27 sort(a,a+n,comp); 28 for(i=0;i<n;i++) 29 if(a[i].id==0) 30 { 31 number++; 32 a[i].id=1; 33 minn=a[i].x; 34 for(j=i+1;j<n;j++) 35 if(a[j].id==0 && a[j].x<minn) 36 { 37 minn=a[j].x; 38 a[j].id=1; 39 } 40 } 41 printf("%d ",number); 42 } 43 }
//memory:252KB time:312ms
1 #include <iostream>//这是直接用叉积求多边形面积的 2 #include <algorithm> 3 #include <cstdio> 4 #include <string.h> 5 #include <iostream> 6 #include <cmath> 7 #include <stdlib.h> 8 using namespace std; 9 int main() 10 { 11 double s; 12 int n,i; 13 int x1,y1,x2,y2,x3,y3; 14 while(scanf("%d",&n),n) 15 { s=0; 16 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 17 for(i=2;i<n;i++) 18 { 19 scanf("%d%d",&x3,&y3); 20 s+=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1); 21 x2=x3;y2=y3; 22 } 23 s=s>0?s:-s; 24 printf("%.1lf ",s*0.5); 25 26 } 27 return 0; 28 }
//memory:240KB time:0ms
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int r,c,a[100][100],dp[100][100],add[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 7 8 int get_high(int x,int y) 9 { 10 if(dp[x][y]>1) 11 return dp[x][y]; 12 int maxx=1,i,j,hx,hy; 13 for(i=0;i<4;i++) 14 { 15 hx=x+add[i][0]; 16 hy=y+add[i][1]; 17 if(a[x][y]>a[hx][hy] && hx>=0 && hy>=0 && hx<r && hy<c) 18 { 19 int h=get_high(hx,hy)+1; 20 if(h>maxx) maxx=h; 21 } 22 } 23 return maxx; 24 } 25 26 int main() 27 { 28 int i,j,maxx; 29 while(~scanf("%d%d",&r,&c)) 30 { 31 memset(dp,0,sizeof(dp)); 32 for(i=0;i<r;i++) 33 for(j=0;j<c;j++) 34 { 35 scanf("%d",&a[i][j]); 36 dp[i][j]=1; 37 } 38 for(i=0,maxx=0;i<r;i++) 39 for(j=0;j<c;j++) 40 { 41 dp[i][j]=get_high(i,j); 42 if(dp[i][j]>maxx) 43 maxx=dp[i][j]; 44 } 45 printf("%d ",maxx); 46 } 47 return 0; 48 }
//memory:224KB time:16ms