UVA 10684 The jackpot

来源:互联网 发布:php is not running 编辑:程序博客网 时间:2024/05/20 17:59

简单DP,设dp[i]为到终点为i的最大连续和,则dp[i] = max(dp[i - 1] + A[i] , A[i]),时空复杂度为O(n)

其实可以把dp这个数组省掉,用变量B来表示前面的连续和,如果B < 0 那么很显然加上A[i]肯定比A[i]小,所以把B置为A[i] 否则则累加上A[i],在这个过程中求最大的B.

/* * UVA10684.cpp * *  Created on: Jun 7, 2013 *      Author: root */#include <iostream>#include <limits.h>#include <cstdio>using namespace std;const int maxn = 10010;int A[maxn], dp[maxn];int n;int getMax(){int ret = INT_MIN;int B = 0;for(int i = 0; i < n; ++i){if(B <= 0){B = A[i];}else{B += A[i];}ret = max(ret, B);}return ret;}int dp_solve(){dp[0] = A[0];int ret = dp[0];for(int i = 1; i < n; ++i){dp[i] = max(dp[i - 1] + A[i], A[i]);ret = max(ret, dp[i]);}return ret;}int main(){while(scanf("%d" , &n) && n){for(int i = 0; i < n; ++i){scanf("%d", &A[i]);}int ans = dp_solve();if(ans > 0){printf("The maximum winning streak is %d.\n", ans);}else{printf("Losing streak.\n");}}return 0;}




原创粉丝点击