zoukankan      html  css  js  c++  java
  • maximum sum

    uva,10684

     1 #include <iostream>
     2 #include <cstdio>
     3 #define maxn 10005
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int n;
     9     int a[maxn];
    10     while(scanf("%d",&n),n)
    11     {
    12         for(int i=0;i<n;i++)
    13             scanf("%d",&a[i]);
    14         int cnt=0,max=0;;
    15         for(int i=0;i<n;i++)
    16         {
    17             cnt+=a[i];
    18             if(cnt<=0)
    19             {
    20                 cnt=0;
    21                 continue;
    22             }
    23             if(cnt>=max)
    24                 max=cnt;
    25         }
    26         
    27         if(max<=0)
    28             printf("Losing streak.
    ");
    29         else
    30             printf("The maximum winning streak is %d.
    ",max);
    31     }
    32     return 0;
    33 }
    View Code

    uva,507

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #define maxn 20005
     5 using namespace std;
     6 
     7 struct node
     8 {
     9     int st,ed;
    10     int dis,len;
    11     node(){}
    12     node(int st,int ed,int dis,int len):st(st),ed(ed),dis(dis),len(len){}
    13 }p[maxn];
    14 
    15 bool cmp(const node& a,const node& b)
    16 {
    17     if(a.len==b.len)
    18         return a.dis>b.dis;
    19     return a.len>b.len;
    20 }
    21 
    22 int main()
    23 {
    24     int n,s;
    25     int a[maxn];
    26     scanf("%d",&n);
    27     for(int i=1;i<=n;i++)
    28     {
    29         scanf("%d",&s);
    30         for(int j=1;j<s;j++)
    31             scanf("%d",&a[j]);
    32         int start=1,end=0;
    33         int res=0,max=0;
    34         int cnt=0;
    35         for(int k=1;k<s;k++)
    36         {
    37             res+=a[k];
    38             if(res<0)
    39             {
    40                 res=0;
    41                 start=k+1;
    42                 continue;
    43             }
    44             if(res>=max)
    45             {
    46                 max=res;
    47                 end=k+1;
    48                 p[cnt++]=node(start,end,end-start,max);
    49             }
    50         }
    51         sort(p,p+cnt,cmp);
    52         if(max<=0)
    53             printf("Route %d has no nice parts
    ",i);
    54         else
    55             printf("The nicest part of route %d is between stops %d and %d
    ",i,p[0].st,p[0].ed);
    56     }
    57     return 0;
    58 }
    View Code

    uva,108

    两种解法一种已知最优O(n^3) 一种O(n^4)因为是np完全的所以不能在多项式内解决。其实就是二维maximum sum

    但是要转换一下思路。

    1.O(n^3)

    列阵或行阵。  即sum_a[i][j]代表第j列前i行的和。

    然后以k为index,应用maximum sum的思想进行暴力搜索,把每个子矩阵都举一下看最大值。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 #define maxn 105
     8 int main()
     9 {
    10     int n;
    11     scanf("%d",&n);
    12     
    13     int a[maxn][maxn];
    14     for(int i=1;i<=n;i++)
    15         for(int j=1;j<=n;j++)
    16             scanf("%d",&a[i][j]);
    17     int sum_a[maxn][maxn]={0};
    18     
    19     
    20     for(int i=1;i<=n;i++)
    21         for(int j=1;j<=n;j++)
    22         {//因为是正方形所以可以改行:sum_a[i][j]=sum_a[i][j-1]+a[i][j]
    23             sum_a[i][j]=sum_a[i-1][j]+a[i][j];
    24         }
    25     
    26     
    27     int sum,max_sum=INT_MIN;
    28     for(int i=1;i<=n;i++)
    29         for(int j=i;j<=n;j++)
    30         {
    31             sum=0;
    32             for(int k=1;k<=n;k++)
    33             {//sum+=sum_a[k][j]-sum_a[k][i-1]
    34                 sum+=sum_a[j][k]-sum_a[i-1][k];
    35                 if(sum>=max_sum) max_sum=sum;
    36                 if(sum<0) sum=0;
    37             }
    38         }
    39     printf("%d
    ",max_sum);
    40     return 0;
    41 }
    View Code

    2.O(n^4)

    应用dp状态压缩的思想,把子矩形和压缩为一个整数。然后暴力搜。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <limits.h>
     6 
     7 using namespace std;
     8 #define maxn 105
     9 int sum_a[maxn][maxn];
    10 int main()
    11 {
    12     int n;
    13     scanf("%d",&n);
    14     
    15     for(int i=1;i<=n;i++)
    16         for(int j=1;j<=n;j++)
    17         {
    18             scanf("%d",&sum_a[i][j]);
    19             if(i>1) sum_a[i][j]+=sum_a[i-1][j];
    20             if(j>1) sum_a[i][j]+=sum_a[i][j-1];
    21             if(i>1 && j>1) sum_a[i][j]-=sum_a[i-1][j-1];
    22         }
    23     
    24     int sum;
    25     int cnt=0;
    26     for(int i=1;i<=n;i++)
    27         for(int j=1;j<=n;j++)
    28         {
    29             sum=0;
    30             for(int m=i;m<=n;m++)
    31                 for(int k=j;k<=n;k++)
    32                 {
    33                     int cur=sum_a[m][k];
    34                     if(i>1) cur-=sum_a[i-1][k];
    35                     if(j>1) cur-=sum_a[m][j-1];
    36                     if(i>1 && j>1) cur+=sum_a[i-1][j-1];
    37                     cnt=max(cnt,cur);
    38                 }
    39         }
    40     printf("%d
    ",cnt);
    41     return 0;
    42 }
    View Code

    uva,10074

    运用了上一道题目的状态压缩思想。如果一个矩阵的和为0,则把它的行列相乘取最大值。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <limits.h>
     5 
     6 #define maxn 105
     7 using namespace std;
     8 
     9 int main()
    10 {
    11     int n,m;
    12     int sum_a[maxn][maxn];
    13     while(scanf("%d%d",&m,&n),m+n)
    14     {
    15         for(int i=1;i<=m;i++)
    16             for(int j=1;j<=n;j++)
    17             {
    18                 scanf("%d",&sum_a[i][j]);
    19                 if(i>1) sum_a[i][j]+=sum_a[i-1][j];
    20                 if(j>1) sum_a[i][j]+=sum_a[i][j-1];
    21                 if(i>1 && j>1) sum_a[i][j]-=sum_a[i-1][j-1];
    22             }
    23         
    24         
    25         int cnt=0;
    26         
    27         for(int i=1;i<=m;i++)
    28             for(int j=1;j<=n;j++)
    29             {
    30                 for(int l=i;l<=m;l++)
    31                 {
    32                     for(int k=j;k<=n;k++)
    33                     {
    34                         int cur=sum_a[l][k];
    35                         if(i>1) cur-=sum_a[i-1][k];
    36                         if(j>1) cur-=sum_a[l][j-1];
    37                         if(i>1 && j>1) cur+=sum_a[i-1][j-1];
    38                         if(cur==0)
    39                             cnt=max(cnt,(l-i+1)*(k-j+1));
    40                     }
    41                 }
    42             }
    43         printf("%d
    ",cnt);
    44     }
    45     return 0;
    46 }
    View Code
    活在现实,做在梦里。
  • 相关阅读:
    CArray类模板封装示例
    环形队列CQueue类模板示例
    CStack栈模板封装示例
    TSIC506驱动程序
    proteus虚拟串口实现
    js学习笔记(一)
    提升网页性能
    JS性能优化笔记搜索整理
    @font-face制作Web Icon
    原生js动画效果(源码解析)
  • 原文地址:https://www.cnblogs.com/do-it-best/p/5469386.html
Copyright © 2011-2022 走看看