题目链接:HDU 1231 最大连续子序列
dp。
状态转移方程:dp[i]=max(dp[i-1]+arr[i],arr[i]),从左到右扫一遍。dp[i]表示从1(下标从1开始)到i的最大连续子序列的值,这个值要包括arr[i],然后从前往后循坏找最大值。
WA了几次,后来发现是数组开小了,10000看成了1000,郁闷。
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int MAX_N = 10000 + 100;
int dp[MAX_N],arr[MAX_N];
int _beg[MAX_N];
int k;
int main()
{
while(scanf("%d",&k),k)
{
for(int i = 1;i <= k;i++)
scanf("%d",&arr[i]);
dp[1] = arr[1];
int temp = 1;
_beg[1] = temp;
for(int i = 2;i <= k;i++)
{
if(dp[i - 1] + arr[i] >= arr[i])
{
dp[i] = dp[i - 1] + arr[i];
_beg[i] = temp;
}
else
{
dp[i] = arr[i];
_beg[i] = temp = i;
}
}
int _max = -1;
int j = 0;
for(int i = 1;i <= k;i++)
{
if(_max < dp[i])
{
_max = dp[i];
j = i;
}
}
if(_max == -1)
printf("%d %d %d\n",0,arr[1],arr[k]);
else
printf("%d %d %d\n",_max,arr[_beg[j]],arr[j]);
}
return 0;
}
本文介绍了解决HDU1231最大连续子序列问题的方法,通过动态规划算法实现从左到右扫描数组,使用状态转移方程dp[i]=max(dp[i-1]+arr[i],arr[i])来计算最大连续子序列的和。讨论了数组开小导致WA的问题,并提供了正确的代码实现。
1834

被折叠的 条评论
为什么被折叠?



