首页 > 其他分享 >2021icpc(银川)B (2022icpc沈阳热身赛) The Great Wall

2021icpc(银川)B (2022icpc沈阳热身赛) The Great Wall

时间:2022-11-17 11:11:50浏览次数:48  
标签:Great const Wall 2021icpc 贡献 int maxn dp define

题意:

给你一个长度为n的序列。对于每一个k,k∈[1,n].问你将其分成k个段,每个段的贡献为该段最大值-最小值。贡献总和最大值是多少.n≤1e3

分析:

很好写出一个朴素的dp

dp[i][k]=dp[j][k-1]+MAX a(j+1,i)-MIN a(j+1,i) 其中0<j<i

但是复杂度不允许 此时想如果能优化就好了 但是最大最小压根没法优化 没有传递性 所以此时再想优化一定会暴毙的

但是dp[i][k]一定是跑不掉的 这两维一定是固定的

考虑每个数是否造成贡献 一个数可能对贡献+ 对贡献— 不选他贡献0 选两次他贡献0 这四种情况

所以重新设计状态 dp[i][j][0/1/2] 表示 前i个数分成了j段 第i个数 0不造成贡献 1对贡献- 2对贡献+

最大化所选的数之和 最优解一定是每段的最大-最小

非常巧妙 用另一种描述的最优解 同样是题意的正解

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define vll vector<ll>
#define fi first
#define se second
const int maxn = 1e3 + 5;
const int mod = 1e9 + 7;
const int inf = 1e9;
int a[maxn] , dp[maxn][maxn][3];
int main()
{
    for (int i = 0 ; i < maxn ; i++)
        for (int j = 0 ; j < maxn ; j++)
            for (int k = 0 ; k <= 2 ; k++)
                dp[i][j][k] = -inf;

    ios::sync_with_stdio(false);
    int n; cin >> n;
    for (int i = 1 ; i <= n ; i++) cin >> a[i];
    dp[1][0][0] = 0;
    for (int i = 1 ; i <= n ; i++){
        for (int j = 0 ; j < i ; j++){
            if (dp[i][j][0] != -inf){
                // 不填
                dp[i + 1][j][0] = max(dp[i + 1][j][0] , dp[i][j][0]);
                // 填一个-1
                dp[i + 1][j][2] = max(dp[i + 1][j][2] , dp[i][j][0] - a[i]);
                // 填一个1
                dp[i + 1][j][1] = max(dp[i + 1][j][1] , dp[i][j][0] + a[i]);
                // 同时填 +1 -1
                dp[i + 1][j + 1][0] = max(dp[i + 1][j + 1][0] , dp[i][j][0]);
            }
            if (dp[i][j][1] != -inf){
                // 不填
                dp[i + 1][j][1] = max(dp[i + 1][j][1] , dp[i][j][1]);
                // 填一个-1
                dp[i + 1][j + 1][0] = max(dp[i + 1][j + 1][0] , dp[i][j][1] - a[i]);
            }
            if (dp[i][j][2] != -inf){
                // 不填
                dp[i + 1][j][2] = max(dp[i + 1][j][2] , dp[i][j][2]);
                // 填一个+1
                dp[i + 1][j + 1][0] = max(dp[i + 1][j + 1][0] , dp[i][j][2] + a[i]);
            }
        }
    }
    for (int i = 1 ; i <= n ; i++){
        cout << dp[n + 1][i][0] << endl;
    }
    return 0;
}

标签:Great,const,Wall,2021icpc,贡献,int,maxn,dp,define
From: https://www.cnblogs.com/wzxbeliever/p/16898755.html

相关文章

  • E. Cactus Wall
    E.CactusWallMonocarpisplayingMinecraftandwantstobuildawallofcacti.Hewantstobuilditonafieldofsandofthesizeof$n\timesm$cells.Ini......
  • Wallys/Introduction of DR9074 series network card/qcn9074/qcn9072/qcn9024/indust
    DR9074seriesnetworkcard/qcn9074/qcn9072/qcn9024/industrialM.2card ThisisTinafromWallys,weareaMfgofnetworkingdeviceslikecellularrouters,N......
  • ORA-13541: system moving window baseline size (691200) greater than retention (6
    ORA-13541:systemmovingwindowbaselinesize(691200)greaterthanretention(604800)Error:SQL>execdbms_workload_repository.modify_snapshot_settings(inter......
  • Great Sequence (CF2,C) (贪心)
    思路:最后转化成一个链,然后贪心地从链的一端处理即可! #include<bits/stdc++.h>usingnamespacestd;#defineM2000005#defineriregisterintlonglo......
  • pip error: Microsoft Visual C++ 14.0 or greater is required
    https://zhuanlan.zhihu.com/p/471661231去官网下载cpp编译工具:https://my.visualstudio.com/Downloads/Featured?mkt=zh-cn下载后直接安装默认值比起有的教程安装......
  • [LeetCode] 1544. Make The String Great
    Givenastring s ofloweranduppercaseEnglishletters.Agoodstringisastringwhichdoesn'thave twoadjacentcharacters s[i] and s[i+1] where:......
  • firewalld
    firewalldfirewalld内网的windows3389端口被我映射到了一个公网某端口。最近发现有人不断访问该公网端口,疑似在暴力破解密码。公网服务centos7.6,默认的防火墙工具是fi......
  • WallFilter_简介
    遇到的问题:Caused by: java.sql.SQLException: sql injection violation, dbType mysql, druid-version 1.2.8, part alway true condition not allow : ......
  • 1.firewalld 开放新端口
    1.查看防火墙状态systemctlstatusfirewalld2.查看防火墙开放列表firewall-cmd--zone=public--list-ports3.添加防火墙端口firewall-cmd--add-port=28080/t......
  • 2021ICPC济南
    2021ICPC济南时隔一年再来补题,金牌题以下还是可以补的。C(组合数学,DP,贪心)题意两人每次从序列中取数字,希望自己拿到的数字和最大。求可行的操作序列方案数。思路看起来......