题解 简单限行dp 杭电OJ 1003
题意:给T组数据,求每组数据序列和最大的序列,输出最大值和起止位置。
做法:建立一个数组a[n]记录数据,f[n]记录到该点时的最大和;
递推可得,如果f[n-1]>=0,f[n]=f[n-1]+a[n];反之,f[n]=a[n];
代码:
#include <iostream> #include <cstring> using namespace std; int i,j,tot[100000],a[100000]; int main() { int T,number=1; cin>>T; while(T--) { int n; cin>>n; int f[n],b[n]; memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); memset(tot,0,sizeof(tot)); for(i=0;i<n;i++) cin>>a[i]; f[0]=a[0],b[0]=0; for(i=1;i<n;i++) { if(f[i-1]>=0)f[i]=f[i-1]+a[i],b[i]=b[i-1]; else f[i]=a[i],b[i]=i; } int ans=0,pos=0,start=0; for(i=0;i<n;i++) if(ans<f[i])ans=f[i],pos=i,start=b[i]; int j; for(i=0;i<n;i++) { if(a[i]>0) break; else if(i==n-1) { ans=f[0]; for(j=0;j<n;j++) f[j]=a[j]; for(j=0;j<n;j++) if(ans<f[j])ans=f[j],pos=j,start=j; } } cout<<"Case "<<number++<<":"<<endl; cout<<ans<<" "<<start+1<<" "<<pos+1<<endl; if(T!=0) cout<<endl; } return 0; }
错误原因:WA 对于全负数的情况没有加以考虑。