码迷,mamicode.com
首页 > 其他好文 > 详细

maximum sum

时间:2016-05-07 23:38:35      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

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.\n");
29         else
30             printf("The maximum winning streak is %d.\n",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\n",i);
54         else
55             printf("The nicest part of route %d is between stops %d and %d\n",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\n",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\n",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\n",cnt);
44     }
45     return 0;
46 }
View Code

 

maximum sum

标签:

原文地址:http://www.cnblogs.com/do-it-best/p/5469386.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!