NYOJ 44 子串和

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=44

思路:

这道题也是动态规划的问题,开始的时候受导弹拦截的干扰,以为也要从数据的最后面开始处理呢,结果自己觉得思路不对,感觉别扭,后来写出来之后果然是错误的。然后从最开始进行处理,WA了三次,发现很多小的细节没有做好。最后一次提交,AC。解题思路就是从前往后处理数据,判断前面的数据是否大于0,不断的累加,最后输出最大的和。一些小的细节和思想都可以在代码和注释中有所体现。

 1 #include<stdio.h>
 2 int a[1000001];//防止函数内部数组过大,出现错误
 3 int main()
 4 {
 5     int i,n,sum,num;
 6     scanf("%d",&n);
 7     while(n--)
 8     {
 9         sum=-100;
10         scanf("%d",&num);
11         for(i=1;i<=num;i++)//漏掉了“=“号,很是悲剧。
12         {  
13            scanf("%d",&a[i]);
14            if(a[i-1]>0)
15            a[i]+=a[i-1];//进行比较,如果之前的数据和大于0累加,否则重新开始。
16            if(a[i]>sum) sum=a[i];//不断的更新最大值。
17         }
18         printf("%d\n",sum);
19     }
20         return 0;
21 }

 

 

nyoj 44 字串和是经典的动态规划问题,104题将44题的一维最大和扩展到矩阵中,求子矩阵的最大和。

思路大体还是一致的,先来说nyoj44吧。最大字段和问题用枚举,分治和动态规划都能解决,时间复杂度分别为O(n^2), O(nlogn), O(n)。

dp的状态方程: b[j] = max{b[j-1] + a[j], a[j]}, 1<= j <= n; if b[j-1] >0, b[j] = b[j-1]+a[j];else b[j] = a[j];

 1 int maxsum(int n, int *a)
 2 {
 3     int i;
 4     int sum = 0, b = 0;
 5     for(i = 0; i < n; i++)
 6     {
 7         if(b > 0)
 8             b += a[i];
 9         else b = a[i];
10         if(b > sum)
11             sum = b;
12     }
13     return sum;
14 }

 

 

posted on 2012-08-13 16:01  mycapple  阅读(364)  评论(0编辑  收藏  举报

导航