您的位置:首页 > 其它

FOJ 2013 A short problem 解题报告

2011-03-21 12:47 274 查看
A short problem
问题描述

给定一序列:a1,a2,a3,...,an,求其长度不小于m的最大连续子序列。

解题报告

显然这是最大连续子序列的变形。我们只需求解“紧跟”长度为m的连续子序列前的“最大连续子序列问题”。定义f[i]表示在原序列前i个元素中并且以ai为尾的最大连续子序列值,那么最大连续子序列问题的状态转移方程为:f[i]=max{f[i-1]+a[i],a[i]}。结合此题定义:sum(i,j)=ai+a(i+1)+...+a(j-1)+aj,则此题的状态转移方程就是:opt[i]=sum(i-m+1,i)+f[i-m](i>m)。最终结果就是:cnt=max(opt[i])。

#include<iostream>
#include<cstdio>
#define Max 1000001
using namespace std;
int a[Max],f[Max],sum[Max];
void MaxSum(int s,int t){
f[s]=a[s];
for(int i=s+1;i<=t;i++)
f[i]=f[i-1]<0?a[i]:f[i-1]+a[i];
}
int main(){
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
sum[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
MaxSum(1,n);
int cnt=sum[m];
for(int i=2;i+m-1<=n;i++){
int tmp=f[i-1]+sum[i+m-1]-sum[i-1];
if(tmp>cnt) cnt=tmp;
}
printf("%d/n",cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: