//提取信息起始位置,终止位置,最大和
//发现数组较大可以将保存信息改造只存储终止位置
//那么dp[i] = max(a[i],dp[i-1]+a[i])
//主意要用dp[i-1]<0判断如果小于0那么肯定不用算了这题最先算的是从前到后的
//否则直接比较大小的话dp[i]就会出现I,i在前面而不是1-i在前面
//46MS 2792K
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX_N 100005
static int dp[MAX_N];
static int top[MAX_N];//保存初始位置
static int a[MAX_N];
static int n;
static void DP()
{
for (int i=0;i<n;++i)
dp[i] = -9999;
memset(top,0,sizeof(top));
dp[0] = a[0];
top[0] = 0;
int startpos = 0;
int endpos = 0;
int ans = a[0];//主意是从-1000开始算的
for (int i=1;i<n;++i)
{
if (dp[i-1]<0)
{
dp[i] = a[i];
top[i] = i;
}
else
{
dp[i] = dp[i-1]+a[i];
top[i] = top[i-1];
}
if (ans<dp[i])
{
ans = dp[i];
startpos = top[i];
endpos = i;
}
}
printf("%d %d %d\n",ans,startpos+1,endpos+1);
}
int main()
{
int T;
scanf("%d",&T);
for (int t=1;t<=T;++t)
{
scanf("%d",&n);
for (int i=0;i<n;++i)
scanf("%d",&a[i]);
printf("Case %d:\n",t);
DP();
if (t==T)
break;
else
printf("\n");
}
return 0;
}
hdoj1003注意在寻找最优解对应的时候寻找的顺序
最新推荐文章于 2018-05-28 20:28:40 发布