8-6-Exercise

HDU 1003    Max Sum 

题意:给出一串数字,求出其中某段连续的数字之和最大的值,同时要输出起点的位置和终点的位置~~~

方法一:

     用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

HDU 1800      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

HDU 2036     改革春风吹满地

题意:求面积~

该题目是有公式的~

代码:

 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

POJ 1088      滑雪

题意:找出最长的路径~

代码:

 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

原文地址:https://www.cnblogs.com/teilawll/p/3243472.html