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])。
问题描述
给定一序列: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; }
相关文章推荐
- Croc Champ 2013 - Round 2 (Div. 2 Edition) E. Cube Problem 解题报告
- FOJ 2013 A short problem
- 2013长沙网络赛,Problem G,Goldbach,解题报告
- 2013 ACM/ICPC Asia Regional Hangzhou Online(解题报告) 正在更新
- NOIP2013提高组复赛 转圈游戏 解题报告
- 2013 ACM/ICPC Asia Regional Changsha Online - C(Color Representation Conversion)、E (Travelby Bi)解题报告
- NOIP2013Day2T1积木大赛解题报告
- haoi2013软件安装解题报告
- Codeforces Round #397 Problem D. Artsem and Saunders 解题报告
- UVa 387 - A Puzzling Problem 解题报告(暴力)
- ZOJ Problem Set - 2412解题报告
- HDU杭电2013 多校第一场解题报告
- Problem E: 小力的数字游戏 解题报告
- 【图论基础练习】 SCU 2013 Summer Traing 3 - Graph Theory (1) 解题报告
- P1092 - 【NOIP2013】火柴排队 解题报告
- noip2013提高组 积木大赛解题报告
- FOJ--1733--Image Distortion--解题报告
- FOJ--1698--最大乘积--解题报告(大数乘小数的问题)
- POJ 2013 解题报告
- 2013年4月_武科大程序设计大赛(复赛-非专业组)_解题报告(problem 1005)