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!

浙公网安备 33010602011771号