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.\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

 

转载于:https://www.cnblogs.com/do-it-best/p/5469386.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个经典的 Maximum Sum 子数组问题的动态规划代码: ```python def max_sum_subarray(nums): if not nums: return 0 n = len(nums) dp = [0]*n dp[0] = nums[0] max_sum = nums[0] for i in range(1, n): dp[i] = max(dp[i-1]+nums[i], nums[i]) max_sum = max(max_sum, dp[i]) return max_sum ``` 该算法的时间复杂度为 $O(n)$,其中 $n$ 是数组的长度。 ### 回答2: Maximum sum问题是一个经典的动态规划问题,其目标是在一个给定的数组中找到一个具有最大和的子数组。 在解决这个问题时,可以定义一个一维动态规划数组dp,其中dp[i]表示以第i个元素结尾的子数组的最大和。那么,可以得出动态规划的转移方程如下: dp[i] = max(dp[i-1] + nums[i], nums[i]) 其中,nums表示给定的整数数组。 接下来,可以使用一个变量maxSum来记录所有子数组的最大和。遍历整个数组,更新dp[i]的同时,不断更新maxSum的值,即可得到最终的结果。 下面是该问题的动态规划代码实现: ```python def maxSum(nums): dp = [0] * len(nums) maxSum = float('-inf') dp[0] = nums[0] maxSum = max(maxSum, dp[0]) for i in range(1, len(nums)): dp[i] = max(dp[i-1] + nums[i], nums[i]) maxSum = max(maxSum, dp[i]) return maxSum ``` 该算法的时间复杂度为O(n),其中n为数组的长度。使用动态规划的思想,可以高效地解决Maximum sum问题。 ### 回答3: 动态规划(Dynamic Programming)是一种常用的算法思想,可以解决一些最优化问题。Maximum Sum问题是一种经典的动态规划问题,目标是找出一个数组中最大的子数组和。 要编写Maximum Sum的动态规划代码,可以按照以下步骤进行: 1. 首先定义一个变量max_sum,用于记录当前最大的子数组和,初始化为数组中的第一个元素(即max_sum = arr[0])。 2. 然后定义一个变量cur_sum,用于记录当前的子数组和,初始化为数组中的第一个元素(即cur_sum = arr[0])。 3. 接着,使用一个循环遍历数组中的每一个元素(从第二个元素开始): (1)如果当前子数组和cur_sum加上当前元素arr[i]大于当前元素arr[i]本身,说明加上当前元素后,子数组和变得更大,因此更新cur_sum为cur_sum + arr[i]。 (2)否则,当前元素arr[i]比当前子数组和cur_sum更大,说明当前元素作为新的起点,重新开始构建子数组,即令cur_sum = arr[i]。 (3)将当前子数组和cur_sum与当前最大的子数组和max_sum进行比较,如果cur_sum大于max_sum,则更新max_sum为cur_sum。 4. 最后,返回最大的子数组和max_sum作为最终结果。 下面给出这个算法的代码实现: ```python def maximum_sum(arr): max_sum = arr[0] cur_sum = arr[0] for i in range(1, len(arr)): if cur_sum + arr[i] > arr[i]: cur_sum += arr[i] else: cur_sum = arr[i] if cur_sum > max_sum: max_sum = cur_sum return max_sum ``` 这段代码的时间复杂度为O(n),其中n为数组的长度,因为需要遍历整个数组。在使用动态规划思想解决Maximum Sum问题时,可以通过定义合适的状态和状态转移方程来简化问题,并提高算法的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值