其他分享
首页 > 其他分享> > CF513E2 Subarray Cuts

CF513E2 Subarray Cuts

作者:互联网

Link
在\(s\)序列中,极大值对答案的贡献系数为\(2\),极小值的贡献系数为\(-2\),中间部分为\(0\)。(若为首尾,则系数为\(\pm1\))。
设\(f_{i,j,k}\)表示前\(i\)个数,分成\(j\)段,此时状态为\(k\)的答案。总共有四种状态:极大值、极大值到极小值、极小值、极小值到极大值。
转移非常显然,注意要对首尾进行特判。

#include<cstdio>
#include<cstring>
#include<algorithm>
int f[30007][207][4],a[30007];
int read(){int x;scanf("%d",&x);return x;}
int main()
{
    int n=read(),m=read();memset(f,-0x3f,sizeof f);
    for(int i=1;i<=n;++i) a[i]=read();
    for(int i=0;i<=n;++i) for(int j=0;j<4;++j) f[i][0][j]=0;
    for(int i=1;i<=n;++i)
    {
	for(int j=1,x;j<=m;++j)
	{
	    if((x=1+(j^1&&j^m))==2) f[i][j][1]=f[i-1][j-1][1],f[i][j][3]=f[i-1][j-1][3];
	    f[i][j][1]=std::max(f[i][j][1],std::max(f[i-1][j][1],f[i][j][0]=std::max(f[i-1][j][0],f[i-1][j-1][3])-x*a[i]));
	    f[i][j][3]=std::max(f[i][j][3],std::max(f[i-1][j][3],f[i][j][2]=std::max(f[i-1][j][2],f[i-1][j-1][1])+x*a[i]));
	}
    }
    printf("%d",std::max(f[n][m][1],f[n][m][3]));
}

标签:include,int,read,CF513E2,极大值,Cuts,Subarray,系数,极小值
来源: https://www.cnblogs.com/cjoierShiina-Mashiro/p/12643629.html