标签:一个 pre c++ 表示 scan 标记 技术分享 TE ase

一看就知道是dp了...
转移方程f[i]=max(f[i-1]+d[i],d[i])
主要是起始位置和结束位置的标记有点困难
这里用两个临时变量s,e表示当前组的起始位置和结束位置
可以这么想
一旦f[i-1]+d[i]<d[i],就说明可以新开一组,s=i,否则e++
只要当前最大和ans1<f[i],就可以更新起始位置ans2=s,结束位置ans3=e;
代码
#include<bits/stdc++.h>
using namespace std;
const int N=110000;
int d[N],dp[N];
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
int n,ans1,ans2,ans3,s,e;
ans1=-1e9,ans2=ans3=s=1;
e=0;
scanf("%d",&n);
for(int j=1;j<=n;j++)
scanf("%d",&d[j]);
for(int j=1;j<=n;j++)
{
if(dp[j-1]>=0)
dp[j]=dp[j-1]+d[j],e++;
else
s=e=j,dp[j]=d[j];
if(ans1<dp[j])
{
ans1=dp[j];
ans2=s;
ans3=e;
}
}
printf("Case %d:\n",i);
printf("%d %d %d\n",ans1,ans2,ans3);
if(i<t) printf("\n");
}
}
哦对了还要注意输出格式,最后一个样例不需要空两行
标签:一个 pre c++ 表示 scan 标记 技术分享 TE ase
原文地址:https://www.cnblogs.com/greengenius/p/9206181.html