hdoj_1231&&hdoj_1003最大连续子序列
#include <iostream> #include <vector> #include <string> #include <fstream> #include <ctime> #include <cstdlib> using namespace std; int Start = 0; int End = 0; int maxSubSum(const vector<int>& a) { int maxSum = -1, thisSum = 0; int t = 0; for (int j = 0; j < a.size(); j++) { thisSum += a[j]; if (thisSum > maxSum) { maxSum = thisSum; Start = t; End = j; } else if (thisSum < 0) { thisSum = 0; t = j + 1; } } return maxSum; } int main() { freopen("in.txt","r",stdin); int n, num; vector<int>a; bool flag; while(scanf("%d",&n) !=EOF && n != 0) { flag = false; for(int i = 0; i < n; i++) { scanf("%d", &num); if(num >= 0) flag = true; a.push_back(num); } if(flag) { int sum = maxSubSum(a); cout << sum << " " << a[Start] << " " << a[End] << endl; } else { cout << 0 << " "<< a[0] << " " << a[a.size() - 1] << endl; } a.clear(); } return 0; }
求最大子序列和的算法见http://blog.csdn.net/lgh1992314/article/details/8257482
1003
#include <iostream> #include <string> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; int Start, End, n; int num[100005]; int DP() { int thissum = 0, maxsum = -999999; int t = 0; for(int i = 0; i < n; i++) { thissum += num[i]; if(thissum > maxsum) { maxsum = thissum; Start = t; End = i; } if(thissum < 0) { thissum = 0; t = i + 1; } } return maxsum; } int main() { freopen("in.txt", "r", stdin); int t; scanf("%d", &t); for(int i = 1; i <= t; i++) { memset(num, 0, sizeof(num)); scanf("%d", &n); for(int j = 0; j < n; j++) { scanf("%d", &num[j]); } Start = 0; End = 0; int maxsum = DP(); printf("Case %d:\n", i); printf("%d %d %d\n", maxsum, Start + 1, End + 1); if(i != t) printf("\n"); } return 0; }
Keep it simple!