动态规划复习-HDU1231

子序列最大和问题,记录开始结束位置。
#include 

int k, m, st, ed;
int a[10001], dp[10001], s[10001], e[10001];

int main() {
	while (scanf("%d", &k), k) {
		for (int i = 1; i <= k; ++i)
			scanf("%d", &a[i]);
		dp[0] = 0;
		s[0] = 0;
		e[0] = 0;
		for (int i = 1; i <= k; ++i) {
			if (dp[i - 1] + a[i] > a[i]) {
				dp[i] = dp[i - 1] + a[i];
				s[i] = s[i - 1];
			} else {
				dp[i] = a[i];
				s[i] = i;
			}
			e[i] = i;
		}
		m = -10000;
		st = ed = 0;
		for (int i = 1; i <= k; ++i) {
			if (dp[i] > m) {
				m = dp[i];
				st = s[i];
				ed = e[i];
			}
		}
		if (m < 0) {
			printf("%d %d %d\n", 0, a[1], a[k]);
		} else {
			printf("%d %d %d\n", m, a[st], a[ed]);
		}
	}
	return 0;
}

posted on 2012-02-07 22:41  sing1ee  阅读(105)  评论(0)    收藏  举报