hdoj 1003不知道为什么一直WA
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1003
求最大子序列和的问题:
- C/C++ code
#include <stdio.h> int main() { int ids,i,j,len; int b[100002],max,s,e; //max最大和,s开始位置,e终止位置 int a[100002]; scanf("%d",&ids); for(i=1;i<=ids;i++){ //输入数组 scanf("%d",&len); for(j=0;j<len;j++){ scanf("%d",&a[j]); } //DP方程 B[j] = max(B[j-1]+A[j], A[j]) b[0]=a[0];s=e=0;max=b[0]; for(j=1;j<len;j++){ if(b[j-1]+a[j]<a[j]){ b[j] = a[j]; s = j; } else { b[j] = b[j-1]+a[j]; } if(b[j]>max){ max = b[j]; e = j; } } printf("Case %d:\n", i); printf("%d %d %d", max<-1000?-1000:max,s+1,e+1); if(i==ids) printf("\n"); else printf("\n\n"); } return 0; }
我测试了很多用例都可以,题目上的几个要求也都测试过:
1. 返回第一个最大子序列
2. 值范围在-1000-1000,这个我测试过Ac的版本,大于1000可以通过。
3. 对于全负数就是找到最大的负数,也没问题
实在找不出为什么呢,纠结
[解决办法]
增加一个变量x可以AC:
- C/C++ code
#include <stdio.h> int main() { int ids,i,j,len; int b[100002],max,s,e; //max最大和,s开始位置,e终止位置 int x;//加 int a[100002]; scanf("%d",&ids); for(i=1;i<=ids;i++){ //输入数组 scanf("%d",&len); for(j=0;j<len;j++){ scanf("%d",&a[j]); } //DP方程 B[j] = max(B[j-1]+A[j], A[j]) b[0]=a[0];s=e=0;max=b[0]; x = 0;//加 for(j=1;j<len;j++){ if(b[j-1]+a[j]<a[j]){ b[j] = a[j]; x = j; //改 s = j; } else { b[j] = b[j-1]+a[j]; } if(b[j]>max){ max = b[j]; s = x;//加 e = j; } } printf("Case %d:\n", i); printf("%d %d %d", max<-1000?-1000:max,s+1,e+1); if(i==ids) printf("\n"); else printf("\n\n"); } return 0; }