您的位置:首页 > 其它

HDU 1003 Max Sum 动态规划 || 尺取法

2018-03-28 21:20 381 查看

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=1003

题意:

给出一个长度为n的序列,求出这个序列中的子序列,使其和最大,输出和已经子序列的左右端点下标

思路:

有动态规划和尺取法两种方法

代码:

动态规划:

#include <bits/stdc++.h>

using namespace std;

const int N = 100000 + 10;

int a
, dp
;

int main()
{
int t, n, cas = 0;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
int ans = INT_MIN, ansl = 0, ansr = 0;
int l = 1, r = 1;
for(int i = 1; i <= n; ++i)
{
if(dp[i-1] + a[i] < a[i])
{
dp[i] = a[i];
l = r = i;
}
else
{
dp[i] = dp[i-1] + a[i];
r = i;
}
if(dp[i] > ans)
{
ans = dp[i];
ansl = l, ansr = r;
}
}
printf("Case %d:\n", ++cas);
printf("%d %d %d\n", ans, ansl, ansr);
if(t) puts("");
}
return 0;
}


尺取法:

#include <bits/stdc++.h>

using namespace std;

const int N = 100000 + 10;

int a
, dp
;

int main()
{
int t, n, cas = 0;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
int ans = INT_MIN, ansl = 0, ansr = 0;
int l = 1, r = 1, sum = 0;
for(int i = 1; i <= n; ++i)
{
sum += a[i];
if(sum > ans)
{
ans = sum;
ansl = l, ansr = i;
}
if(sum < 0)
{
sum = 0;
l = i+1;
}
}
printf("Case %d:\n", ++cas);
printf("%d %d %d\n", ans, ansl, ansr);
if(t) puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: