hdu 1231 最大连续子序列(水题)
2014-03-29 10:02
363 查看
思路:和求最大连续子序列和差不多,添加个标记前后即可。
更新:之前写的这个代码不是很好理解,用dp做了下,
代码:
dp:
更新:之前写的这个代码不是很好理解,用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; }
相关文章推荐
- HDU 1231 最大连续子序列(水题)
- HDU 1231 最大连续子序列(水题)
- HDU 1231 最大连续子序列( DP做法 + 水题做法)
- HDU ~ 1231 ~ 最大连续子序列(DP)
- hdu 1231 最大连续子序列
- hdu 1231 最大连续子序列
- HDU 1231 最大连续子序列(DP)
- HDU 1231 最大连续子序列(DP)
- HDU 1231最大连续子序列(简单动态规划)
- HDU 1231:最大连续子序列(DP)
- HDU 1231 最大连续子序列
- HDU 1231 最大连续子序列 DP .
- HDU 1231 最大连续子序列
- 最大连续子序列和(经典DP) 之 hdu 1231 最大连续子序列
- HDU 1231(最大连续子序列)
- HDU 1231 最大连续子序列(HDU 1003 dp)
- HDU-1231 最大连续子序列
- hdu 1231 最大连续子序列
- 最大连续子序列(HDU - 1231)
- hdu 1231 最大连续子序列