首页 > 其他分享 >『题解』P9688

『题解』P9688

时间:2023-10-04 09:01:28浏览次数:57  
标签:P9688 颜色 int 题解 Max include 单调

题目传送门

思路:

设有两个颜色 \(x_1 x_2\) ,两端分别为 \(l_1\) \(r_1\) , \(l_2\) \(r_2\)。通过观察可以发现,若满足 \(x_1<x_2\) 且 \(r_1 > l_2\) 则 \(x_1 x_2\) 一定是单调不下降的。

那么我们可以先预处理出一个颜色可以与前面的哪些颜色构成单调不下降,然后用dp求出最终答案。

设 \(f_{i\ j}\) 为选择第 \(i\) 个颜色,选择了 \(j\) 个颜色时的最大价值。设可以与 \(i\) 颜色构成单调不下降的颜色为 \(l\)。转移方程为\(f_{i\ j}=max{\ f_{i\ j}\ f_{l\ j-1}}\)

code:

#include <iostream>
#include <vector>
#include <cstring>
#define int long long
using namespace std;
const int Max = 5e2+10;
int n,k;
int a[Max],b[Max];
int l[Max],r[Max];
vector<int>m[Max],c[Max];
int f[Max][Max],ans;
inline int read(){
    int num=0,fl=1;char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') fl=-1;
        c=getchar();
    }
    while(c >='0'&&c <='9'){
        num=(num<<3)+(num<<1)+(c^48);
        c=getchar();
    }
    return num*fl;
}
signed main(){
    memset(f,-0x3f,sizeof f);
    n=read(),k=read();
    for(int i = 1;i <= n;i++){
        a[i]=read();
        m[a[i]].push_back(i);
        if(!l[a[i]])l[a[i]]=i;
        r[a[i]]=i;
    }
    for(int i = 1;i <= n;i++){
        b[i]=read();
    }
    for(int i = 1;i <= n;i++){ //预处理
        if(!m[i].empty()){
            for(int j = 1;j < i;j++){
            	if(!m[j].empty()){
            		if(r[j]<l[i]){
            			c[i].push_back(j);
					}
				}
			}
        }
    }
    f[0][0]=0;//dp初始化
    for(int i = 1;i <= n;i++){
        if(!m[i].empty()){
            f[i][1]=b[i];
        }
    }
    for(int i = 1;i <= n;i++){//dp
        if(!m[i].empty()){
            for(int j = 2;j <= k;j++){
                for(int l=0;l<c[i].size();l++){
                    f[i][j]=max(f[i][j],f[c[i][l]][j-1]+b[i]);
                }
            }    
        }
    }
    for(int i = 1;i <= n;i++){
        ans=max(ans,f[i][k]);
    }
    if(ans==0)printf("-1");
    else printf("%lld",ans);
    return 0;  
}

标签:P9688,颜色,int,题解,Max,include,单调
From: https://www.cnblogs.com/2k3114/p/17741907.html

相关文章

  • 题解 Coloring Brackets
    题目链接对于括号问题,考虑区间\(dp\)。这道题的括号序列是固定的,所以直接找出每个括号对应的括号在进行转化即可。设\(f_{l,r,0/1/2,0/1/2}\)表示\(l\simr\),左括号不染色/染红色/染蓝色,右括号不染色/染红色/染蓝色的方案数。若\(l,r\)是一对匹配括号,那么f_{l,r}便可以......
  • CF1661D Progressions Covering 题解
    最详细的题解题目传送门:ProgressionsCovering阅读前人题解时,限于个人能力有限,有一些地方想了好一会儿才懂。发现很多题解都是在@SDLTF_凌亭风等作者基础上延伸,但详细程度依旧有限,尽管这篇题解亦是站在他们基础上延伸的,这篇题解更为详细的点明了很多地方。本人第一次写题解,......
  • 洛谷 Power Tree 题解
    题目链接PowerTree分析将叶子节点按dfs序重标号后,每次控制操作可以转化为将子树内叶子节点所在区间加(或减)一个数不难可以想到将叶子区间进行差分每次对\(l\)到\(r\)的操作可以转化为将\(l\)上的数转移到\(r+1\)上每次操作后差分数组的和不变将所有点权变为\(0\)......
  • [题解] CF632F - Swimmers in the Pool
    CF632F-SwimmersinthePool题目传送门题意给定一个大小为\(n\timesn\)的矩阵\(A\)。假设\(A\)满足以下条件,那么称该矩阵为MAGIC,否则为NOTMAGIC,并输出对应的属性(即\(A\)是MAGIC还是NOTMAGIC)。$A_{i,j}=A_{j,i}$;$A_{i,i}=0$;$A_{i,j}\le......
  • GDCPC2023 B , D , F , K 题解
    和队友一起打的2023年广东省大学生程序设计竞赛重现赛,写了B,D,K,胡了一个F。D题目大意随着广东的建设与发展,越来越多人选择来到广东开始新生活。在一片新建的小区,有\(n\)个人要搬进\(m\)栋排成一行的房子,房子的编号从\(1\)到\(m\)(含两端)。房子\(u\)和\(v\)相邻......
  • 题解 [CSP-S 2021] 括号序列
    题目链接对于括号题,基本是栈匹配没有匹配的左括号和区间\(dp\)两个方向。这道题括号序列并不确定,只能用区间\(dp\)搞。如果直接设\(f_{l,r}\)表示\(l\simr\)的合法括号序列,那么由区间\(dp\)的套路可知,需要枚举中间点进行合并,那么\(()()()\)的情况就会出问题,原因是......
  • 【UVA 12100】Printer Queue 题解(队列+优先队列)
    计算机科学学生会中唯一的打印机正经历着极其繁重的工作量。有时,打印机队列中有100个作业,您可能需要等待数小时才能获得一页输出。由于某些作业比其他作业更重要,黑客将军为打印作业队列发明并实现了一个简单的优先级系统。现在,为每个作业分配1到9之间的优先级(9是最高优先级,1是最低......
  • [题解]CF1748C Zero-Sum Prefixes
    UPD23.10.3更新的对思路的描述,以及代码。思路对于每一个\(a_i=0\),如果我们将它变为\(x\),都可以直接将\(i\simn\)位置上的前缀和加\(x\)。设\(a_j\)是\(a_i\)后第一个\(0\),那么,在\(j\)时同样有上述规律。所以,我们只需在\(i\)时考虑,\(i\sim(j-1)\)的贡......
  • 题解 [蓝桥杯 2016 省 B] 交换瓶子
    题目链接本题解讲解环图的做法。要将一个\(1\simn\)的排列通过交换变成\(1\simn\),可以先将\(i\)向\(a_i\)连边,那么最终一定会练成若干个环(每个点只有一个出度,也只有一个入度)。假设交换在同一个环中的节点,一个环显然会变成两个环,也就是说,交换一次最多增加一个环的数量,......
  • 【题解】洛谷 P1003 [NOIP2011 提高组] 铺地毯
    原题链接解题思路如果直接按照题意开一个二维数组来模拟每个点最上面的地毯编号,会发现所占空间最坏情况下约为(2*105)2*4B=4*1010*4B=1.6*1011B≈149GB,程序完全无法运行。但实际上没有必要将每一个点的信息记录下来,只需要记录每一块地毯能覆盖哪些点,再依次判断哪那些地毯可以......