标签:
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 }
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 }
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 }
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 }
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 }
标签:
原文地址:http://www.cnblogs.com/do-it-best/p/5469386.html