找了一道题目HDU - 1231,写法有很多。
我的最优战绩109ms,我真的不晓得Leaderboard里62ms,甚至还有15ms的大佬们是怎么做到的orz!
Code(dp递推未优化)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 10050;
int dp[maxn];
int a[maxn];
int n;
int ans;
int Left, Right;
int findLeft()
{
int index;
for (index = Right; index >= 1; index--)
{
if (dp[index - 1] < 0) break;
}
return index;
}
int main()
{
while (cin >> n && n)
{
for (int i = 0; i < n; i++) cin >> a[i];
dp[0] = a[0];
ans = dp[0];
Left = Right = 0;
for (int i = 1; i < n; i++)
{
dp[i] = max(0, dp[i - 1]) + a[i];
if (dp[i] > ans)
{
Right = i;
ans = dp[i];
}
}
Left = findLeft();
if (ans >= 0) cout << ans << " " << a[Left] << " " << a[Right] << endl;
else cout << 0 << " " << a[0] << " " << a[n - 1] << endl;
}
return 0;
}
本段代码测试时间:702ms
再优化 (dp递推优化)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 10050;
int dp[maxn];
int a[maxn];
int n;
int ans;
int Left, Right;
int findLeft()
{
int index;
for (index = Right; index >= 1; index--)
{
if (dp[index - 1] < 0) break;
}
return index;
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
scanf("%d", &a[0]);
dp[0] = a[0];
ans = dp[0];
Left = Right = 0;
for (int i = 1; i < n; i++)
{
scanf("%d", &a[i]);
dp[i] = max(0, dp[i - 1]) + a[i];
if (dp[i] > ans)
{
Right = i;
ans = dp[i];
}
}
Left = findLeft();
if (ans >= 0) cout << ans << " " << a[Left] << " " << a[Right] << endl;
else cout << 0 << " " << a[0] << " " << a[n - 1] << endl;
}
return 0;
}
耗时缩短至124ms
Code(O(n)优化,省去了找左边界)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 10050;
int a[maxn];
int n;
int ans;
int Left, Right;
int main()
{
while (scanf("%d", &n) != EOF && n)
{
scanf("%d", &a[0]);
ans = a[0];
Left = Right = 0;
int sum = a[0];
int flag = Left;
for (int i = 1; i < n; i++)
{
scanf("%d", &a[i]);
if (sum < 0)
{
sum = a[i];
flag = i;
}
else sum += a[i];
if (sum > ans)
{
ans = sum;
Right = i;
Left = flag;
}
}
if (ans >= 0) cout << ans << " " << a[Left] << " " << a[Right] << endl;
else cout << 0 << " " << a[0] << " " << a[n - 1] << endl;
}
return 0;
}
耗时仍然为124ms
Code(继续优化,考虑到数据问题,我们将全部为负数的情况加以特判,时间成功缩减至109ms)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 10001;
int a[maxn];
int n;
int main()
{
while (scanf("%d", &n) != EOF && n)
{
int plot = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if (a[i] >= 0) plot = 1;
}
if (!plot) printf("0 %d %d\n", a[0], a[n - 1]);
else
{
int ans = a[0];
int Left = 0, Right = 0;
int sum = a[0];
int flag = Left;
for (int i = 1; i < n; i++)
{
if (sum < 0)
{
sum = a[i];
flag = i;
}
else sum += a[i];
if (sum > ans)
{
ans = sum;
Right = i;
Left = flag;
}
}
printf("%d %d %d\n", ans, a[Left], a[Right]);
}
}
return 0;
}