原题:https://www.vijos.org/p/1850
类型:dp
时间:2014.3.8
源码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
long long sz[1000001],tz[1000001],fs[1000001],s[1000001],n,p;
int main()
{
scanf("%lld %lld",&n,&p);
for(long long i=1;i<=n;i++) { scanf("%lld",&sz[i]); }
s[1]=sz[1];
for(int i=2;i<=n;i++)
{
if(s[i-1]+sz[i]>sz[i]) { s[i]=s[i-1]+sz[i]; }
else { s[i]=sz[i]; }
}
tz[1]=s[1];
for(long long i=2;i<=n;i++)
{
if(tz[i-1]<s[i]) { tz[i]=s[i]; }
else { tz[i]=tz[i-1]; }
}
fs[1]=tz[1]; fs[2]=tz[1]+fs[1];
for(long long i=3;i<=n;i++)
{
if(fs[i-1]+tz[i-1]>fs[i-1]) { fs[i]=fs[i-1]+tz[i-1]; }
else { fs[i]=fs[i-1]; }
}
long long max;
if(fs[1]>=fs[n]) { max=fs[1]; }
else { max=fs[n]; }
if(max>=0) { printf("%lld",max%p); }
else { printf("-%lld",(-max)%p); }
return 0;
}
最后状态:80(AC实在麻烦)