September 24th 模拟赛C T2 序列和 Solution

来源:互联网 发布:知乎数据接口 编辑:程序博客网 时间:2024/05/21 06:49

空降题目处(外网)
点我点我点我
空降题目处(内网)
点我点我点我

Description

N个数排成一个环,请选出不超过K段的连续的数,段与段间不能重叠,且使得选出的数和最大。

Input

第一行包含两个正整数N和k。
接下来1行描述这N个数。

Output

包含一个数,即要去的最大的和。

Solution

其实和环没有(卵)关系,只要求最小的做一遍,求最大的做一遍,得较优就好了.
Fi,j,0/1为第i位,第j段选/不选的最大/小值.
方程:
Fi,j,0=max(Fi1,j,0,Fi1,j,1)
Fi,j,1=max(Fi1,j1,0,Fi1,j,1)+Di
Ans=max(Fi,j,0,Fi,j,1)

Code

C++

#include<fstream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int tot,ans,m,n,k,d[1001000],f[101000][20][2];int main(){    scanf("%d%d",&n,&k);    for (int i=1;i<=n;i++)    {        scanf("%d",&d[i]);        tot+=d[i];    }    m=-2147483647;    memset(f,-0x7f,sizeof(f));    f[1][1][1]=d[1];    f[1][0][0]=0;    for (int i=2;i<=n;i++)        for (int j=0;j<=k;j++)        {            f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]);            f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j][1])+d[i];            m=max(m,max(f[i][j][0],f[i][j][1]));        }    ans=m;    m=2147483647;    memset(f,0x7f,sizeof(f));    f[1][1][1]=d[1];    f[1][0][0]=0;    for (int i=2;i<=n;i++)        for (int j=0;j<=k;j++)        {            f[i][j][0]=min(f[i-1][j][0],f[i-1][j][1]);            f[i][j][1]=min(f[i-1][j-1][0],f[i-1][j][1])+d[i];            m=min(m,min(f[i][j][0],f[i][j][1]));        }    ans=max(ans,tot-m);    printf("%d",ans);}

Pascal

uses math;var        f,d:array[0..100000,0..10,0..1] of longint;        a:array[1..100000] of longint;        n,k,i,j,sum:longint;begin        //assign(input,'data.in'); reset(input);        readln(n,k);        for i:=1 to n do        begin               read(a[i]);               inc(sum,a[i]);        end;        for i:=1 to n do                for j:=1 to k do                begin                        f[i,j,1]:=max(f[i-1,j,1],f[i-1,j-1,0])+a[i];                        f[i,j,0]:=max(f[i-1,j,1],f[i-1,j,0]);                        d[i,j,1]:=min(d[i-1,j,1],d[i-1,j-1,0])+a[i];                        d[i,j,0]:=min(d[i-1,j,1],d[i-1,j,0]);                end;        writeln(max(max(f[n,k,1],f[n,k,0]),max(sum-d[n,k,1],sum-d[n,k,0])));end.
0 0
原创粉丝点击