题目来自杭电ACM: acm.hdu.edu.cn
C语言代码如下:
#include
#define N 100010
int a[N], sum[N];
int main()
{
int count, n, i, maxSum, x, y;
scanf("%d", &count);
int k = count;
while(count--){
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
sum[1] = a[1];
maxSum = sum[1];
y = 1;
for (i = 2; i <= n; i++){
if (sum[i-1] > 0)
sum[i] = sum[i-1] + a[i];
else
sum[i] = a[i];
}
for (i = 2; i <= n; i++){
if (sum[i] > maxSum){
maxSum = sum[i];
y = i;
}
}
int t = 0;
x = y;
for(i = y; i > 0; i--)
{
t += a[i];
if(t == maxSum)
x = i;
}
printf("Case %d:\n", k - count);
printf("%d %d %d\n", maxSum, x, y);
if (count)
printf("\n");
}
return 0;
}
#include
using namespace std;
const int maxn = 1000010;
const int INF = 1000000000;
int s[maxn],dp[maxn],pre[maxn];
int main()
{
int t;
cin >> t;
for(int i = 1 ; i <= t ; ++ i) {
if(i > 1) {
cout << endl;
}
int n;
cin >> n;
for(int j = 1 ; j <= n ; ++ j) {
cin >> s[j];
}
dp[1] = s[1];
pre[1] = 1;
for(int j = 2 ; j <= n ; ++ j) {
if(dp[j-1] > 0) {
dp[j] = dp[j-1] + s[j];
} else {
dp[j] = s[j];
}
if(dp[j-1] >= 0) {
pre[j] = pre[j-1];
}else {
pre[j] = j;
}
}
cout << "Case " << i << ":" << endl;
int max = -INF;
int end = 1;
for(int j = 1 ; j <= n ; ++ j) {
if(dp[j] > max) {
max = dp[j];
end = j;
}
}
cout << max << " " << pre[end] << " " << end << endl;
}
return 0;
}