最大连续子序列
http://acm.hdu.edu.cn/showproblem.php?pid=1231
这题以前一直没弄懂,学了dp后回头看,觉得很容易理解,这题可以当做dp做,也可以当做贪心做
定义dp[i],以i结尾的最长连续子序列的值
#include <iostream>
#include <algorithm>
#include <cstring>
#include <functional>
using namespace std;
typedef long long ll;
const int MAXN = 10005;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int NIL = -1;
int arr[MAXN];
int dp[MAXN];
int main(void)
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int k, l, r, ans, ansl, ansr;
while (cin >> k)
{
if (k == 0)
return 0;
ans = -1;
dp[0] = -1;
ansl = ansr = l = r = 1;
for (int i = 1; i <= k; ++i)
{
cin >> arr[i];
//dp[i] = max(arr[i], dp[i - 1] + arr[i]);
if (arr[i] <= dp[i - 1] + arr[i])
{
r = i;
dp[i] = dp[i - 1] + arr[i];
}
else
{
l = r = i;
dp[i] = arr[i];
}
if (dp[i] > ans)
{
ansl = l;
ansr = r;
ans = dp[i];
}
}
if (ans < 0)
cout << 0 << " " << arr[1] << " " << arr[k] << endl;
else
cout << ans << " " << arr[ansl] << " " << arr[ansr] << endl;
}
return 0;
}