首页 > 代码库 > hdu4561 bjfu1270 最大子段积
hdu4561 bjfu1270 最大子段积
就是最大子段和的变体。最大子段和只要一个数组,记录前i个里的最大子段和在f[i]里就行了,但是最大子段积因为有负乘负得正这一点,所以还需要把前i个里的最小子段积存起来。就可以了。直接上代码:
/* * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <set>#include <map>#include <stack>#include <string>#include <vector>#include <deque>#include <list>#include <functional>#include <numeric>#include <cctype>using namespace std;//输入非负整数,用法int a = get_int();int get_int() { int res = 0, ch; while (!((ch = getchar()) >= ‘0‘ && ch <= ‘9‘)) { if (ch == EOF) return -1; } res = ch - ‘0‘; while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘) res = res * 10 + (ch - ‘0‘); return res;}//输入整数(包括负整数,故不能通过返回值判断是否输入到EOF,本函数当输入到EOF时,返回-1),用法int a = get_int2();int get_int2() { int res = 0, ch, flag = 0; while (!((ch = getchar()) >= ‘0‘ && ch <= ‘9‘)) { if (ch == ‘-‘) flag = 1; if (ch == EOF) return -1; } res = ch - ‘0‘; while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘) res = res * 10 + (ch - ‘0‘); if (flag == 1) res = -res; return res;}const int MAXN = 10009;int maxr[MAXN], minr[MAXN];inline int mymul(int a, int b) { int sign = 1; if (a * b == 0) { return 0; } if (a * b < 0) { sign = -1; } return sign * (abs(a) + abs(b));}int main() { int T = get_int(), tmp, N; int a[3]; for (int t = 1; t <= T; t++) { N = get_int(); maxr[0] = minr[0] = 0; int ans = 0; for (int i = 1; i <= N; i++) { tmp = get_int2() / 2; a[0] = mymul(maxr[i - 1], tmp); a[1] = mymul(minr[i - 1], tmp); a[2] = tmp; sort(a, a + 3); maxr[i] = a[2]; ans = maxr[i] > ans ? maxr[i] : ans; minr[i] = a[0]; } printf("Case #%d: %d\n", t, ans); } return 0;}
hdu4561 bjfu1270 最大子段积
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。