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 }