您的位置:首页 > 其它

hdu 1231 最大连续子序列(水题)

2014-03-29 10:02 363 查看
思路:和求最大连续子序列和差不多,添加个标记前后即可。

更新:之前写的这个代码不是很好理解,用dp做了下,

代码:

#include <stdio.h>

int main() {
int n, k, sum,s, t,ss,tt, max,flag,i;
while(scanf("%d",&n),n){
sum = 0;t = 0;s = 0;max = -1;
flag = 0;
for(i = 0; i < n; ++i){
scanf("%d",&k);
if(sum == 0 && k < 0){
if(i == 0 && !flag){
ss = k;
}
if(i == n - 1 && !flag){
tt = k;
}
continue;
}
flag = 1;
if(sum == 0 && k > 0){
s = k;
}
sum += k;
if(sum < 0){
sum = 0;
}
else {
if(sum > max){
tt = k;
ss = s;
max = sum;
}
}
}
if(!flag){
printf("0 %d %d\n",ss,tt);
}else{
printf("%d %d %d\n",max,ss,tt);
}
}
return 0;
}


dp:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8

const int MAX_ = 10010;
const int N = 100010;
const int INF = 0x7fffffff;

int a[MAX_], dp[MAX_];

int main(){
int n, s, t, mmax, start, end;
while(scanf("%d",&n), n){
for(int i = 1; i <= n; ++i){
scanf("%d",&a[i]);
}
int sum = 0;
mmax = -INF;
s = 1;
t = 0;
for(int i = 1; i <= n; ++i){
if(sum < 0){
sum = a[i];
s = i;
t = i;
}
else {
sum += a[i];
t++;
}
if(sum > mmax){
mmax = sum;
start = s;
end = t;
}
}
if(mmax < 0){
mmax = 0;start = 1;end = n;
}

printf("%d %d %d\n",mmax, a[start], a[end]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: