题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003
#include <iostream> #include<fstream> #include<string> using namespace std; int main() { //ifstream cin("testdata.txt"); int n=0; cin>>n; for(int l=0;l<n;l++) { int size=0; cin>>size; int *p=new int[size]; for(int i=0;i<size;i++) cin>>p[i]; int begin=0; int end=0; int sum=0; int maxsum=p[0]; int maxbegin=0; int maxend=0; for(int i=0;i<size;i++) { sum+=p[i]; if(sum>maxsum) { maxbegin=begin; maxend=i; maxsum=sum; } if(sum<0) { begin=i+1; sum=0; } } cout<<"Case "<<l+1<<":"<<endl; cout<<maxsum<<" "<<maxbegin+1<<" "<<maxend+1<<endl; if(l<n-1) cout<<endl; } }
上面是很久以前做的了,hdu 1231 是同一个题: http://acm.hdu.edu.cn/showproblem.php?pid=1231
题目地址:
有一个新的思路,考察a[j] 作为结尾的最长连续和实际上是求s[i] (i<=j-1) 的最小值,然后这个最小值是“当前最小值”,可以直接把当前要考虑的数和之前找到的最小数进行比较
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int sum[10005]; int a[10005]; int start[10005]; int main() { int n; while(cin>>n) { if(n==0) break; memset(sum,0,sizeof(sum)); memset(start,0,sizeof(start)); int temp; for(int i=0;i<n;i++) { scanf("%d",&a[i+1]); sum[i+1]=sum[i]+a[i+1]; } int curmin=2147483647; int minindex=0; for(int i=1;i<=n;i++) { if(sum[i-1]<curmin) { curmin=sum[i-1]; minindex=i-1; start[i]=minindex; } else { start[i]=minindex; } } int begin=0; int end=0; int max=-2147483647; for(int i=1;i<=n;i++) { if(sum[i]-sum[start[i]]>max) { max=sum[i]-sum[start[i]]; begin=start[i]; end =i; } } if(max>=0) cout<<max<<" "<<a[begin+1]<<" "<<a[end]<<endl; else cout<<0<<" "<<a[1]<<" "<<a[n]<<endl; } }