洛谷比赛 堕落的Joe
2016-09-17 22:25
363 查看
/*暴力50*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100010 #define ll long long using namespace std; ll n,k,f[maxn][110],a[maxn],ans; ll init(){ ll x=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f; } int main() { n=init();k=init(); for(int i=1;i<=n;i++) a[i]=init(); for(int i=1;i<=n;i++) for(int j=0;j<=k;j++){ if(j>0)f[i][j]=max(f[i][j],f[i-1][j-1]+a[i]); f[i][0]=max(f[i][0],f[i-1][j]); ans=max(ans,f[i][j]); ans=max(ans,f[i][0]); } printf("%lld",ans); return 0; }
/* 暴力的算法不好优化啊QAQ 问了一下长郡中学的shenben学弟 换一个状态 f[i]表示前i个且选了第i个的最大值 n*n的做法是枚举前面的没选的最大的f[j-1]+a[j+1]+a[j+2]+...+a[i] 转移就是 f[i]=max(f[j-1]+a[j+1]+a[j+2]+...+a[i]) 考虑到选j与i无关 所以只要找max f[j-1]-s[j] 这里选就选一段 只要保证了i-j<=k就好了 优化嘛 单调队列 里面自然是维护 f[j-1]-s[j] 的最大值 时效性上面说的 i-j<=k 然后 维护下前缀和 */ #include<cstdio> #define maxn 1000010 #define ll long long using namespace std; ll n,k,x,a[maxn],f[maxn],q[maxn],head,tail,ans; ll max(ll a,ll b){ return a<b?b:a; } ll init(){ ll x=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f; } void ins(ll x){ while(f[q[tail]-1]-a[q[tail]]<f[x-1]-a[x]&&head<=tail) tail--; q[++tail]=x; } int main() { n=init();k=init(); for(int i=1;i<=n;i++){ x=init(); a[i]=x+a[i-1]; } ins(1); for(int i=1;i<=n;i++){ int p=q[head]; f[i]=f[p-1]+a[i]-a[p]; ans=max(ans,f[i]); if(i-q[head]==k)head++; if(i!=n)ins(i+1); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 洛谷比赛 Joe的数
- 洛谷—— P2658 汽车拉力比赛
- 关卡一 洛谷比赛
- 洛谷2658 汽车拉力比赛
- 洛谷 P2777 [AHOI2016初中组]自行车比赛
- 洛谷⑨月月赛Round2 官方比赛 OI
- 洛谷 比赛 有感
- 洛谷 U4566 赛车比赛
- 洛谷P1707 刷题比赛
- 洛谷比赛有感
- 洛谷比赛 U5442 买(最长链)
- 【水水水】【洛谷 U4566】赛车比赛
- 洛谷 U2878 小R的分数比赛(fraction)
- 洛谷比赛 U4858 sum
- 洛谷P2658 汽车拉力比赛
- 洛谷比赛『期末考后的休闲比赛2』
- 洛谷 1707 刷题比赛
- 洛谷 P2777 [AHOI2016初中组]自行车比赛
- 洛谷“测试”(这是一场比赛)T3 隔离(最小割)
- 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】