• 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]));
    }
    
  • 相关阅读:
    LCA最近公共祖先Tarjan(离线)
    51nod 1135 原根
    51nod 1134最长递增子序列
    51nod 1130 斯特林公式
    51nod 1186 Miller-Rabin素数测试
    51Nod 1257 背包问题 V3
    另类求组合数
    Gym
    msp430项目编程45
    msp430项目编程44
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12643629.html
Copyright © 2020-2023  润新知