首页 > 其他分享 >【LGR-161-Div.3】洛谷基础赛 #4 P9688 Colo.

【LGR-161-Div.3】洛谷基础赛 #4 P9688 Colo.

时间:2023-11-04 23:44:07浏览次数:64  
标签:P9688 颜色 int Colo 这种 maxn jk 洛谷 include

原题链接:P9688 Colo.

很显然,能够共存的颜色一定不会相交,所以可以记录每个颜色最左边的位置和最右边的位置,我们对于每个颜色只考虑,这个颜色左边的可以和这个颜色共存的额颜色
用f[i][j]表示当前考虑i这种颜色,选i这种颜色,然后在i这种颜色之前(包括这种颜色)一共选了j种颜色的最大价值
那么很显然,我们可以枚举i这种颜色左边的可以和i共存的颜色,用k代表,依次取不选k和选了k再选i的最大值,最终再取最大值

也就是,对于每一个j,我们都做一遍dp(i,j)=max(dp(j,j−1)+w[i],dp(i,j))

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int maxn = 10020;

int a[maxn];              //存储序列
int l[maxn], r[maxn];     //l[i]记录i这种颜色最左边的位置,r[i]记录i这种颜色最右边的位置

int w[maxn];              //w[i]存储i这种颜色的价值

int f[maxn][maxn];        //f[i][j]表示的是选择i这种颜色,并且一共学了j种颜色的最大价值
//那么我们考虑所有可以和i这种颜色一块保留的颜色并放到i前面的,例如jk,比较保留jk和不保留jk的结果
//也就是f[i][j]=max(f[i][j],f[i][j-1]+w[jk])

int n, k;

vector<int>e[maxn];



signed main()
{
    cin >> n >> k;

    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (!l[a[i]])l[a[i]] = i;           //如果这种颜色的最左边位置还为0,那么此时就是它的最左边位置
        r[a[i]] = i;                        //不断更新这种颜色的最右边
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> w[i];
    }


    for (int i = 0; i <= n; i++) {
        for (int j = 1; j <= k; j++)f[i][j] = -1e18;                     //这里的初始化之所以i从0开始,j从1开始,是为了让f[i][0]=0,再加上后面e[a[i]].push_back(0);可以保证,第一次执行
                                                                         /*
                                                                                  for (int p = 1; p <= k; p++) {
                                                                                        f[a[i]][p] = max(f[a[i]][p], f[v][p - 1] + w[a[i]]);
                                                                                     }
                                                                                可以把f[a[i][1]设置成w[a[i]]
                                                                          */
    }

    for (int i = 1; i <= n; i++) {
        e[a[i]].push_back(0);
        for (int j = 1; j <= n; j++) {
            if (i == j)continue;
            if (r[a[j]]<l[a[i]] && a[i]>a[j])e[a[i]].push_back(a[j]);//,cout<<a[i]<<" "<<a[j]<<endl;
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < e[a[i]].size(); j++) {
            int v = e[a[i]][j];
            for (int p = 1; p <= k; p++) {
                f[a[i]][p] = max(f[a[i]][p], f[v][p - 1] + w[a[i]]);
            }
        }
    }
   
    int mx = -1;
    for (int i = 1; i <= n; i++)mx = max(mx, f[i][k]);
    cout << mx;
    return 0;
}


标签:P9688,颜色,int,Colo,这种,maxn,jk,洛谷,include
From: https://www.cnblogs.com/z4t15/p/17809803.html

相关文章

  • 【洛谷 P1085】[NOIP2004 普及组] 不高兴的津津 题解(打擂台法)
    [NOIP2004普及组]不高兴的津津题目描述津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因......
  • 基于泛微Ecology代码块开发实现劳动合同开始结束日期、试用开始结束日期计算赋值
    基于泛微Ecology代码块开发实现劳动合同开始结束日期、试用开始结束日期计算赋值//劳动合同开始结束日期、试用开始结束日期计算赋值,载入时触发,jQuery().ready(function(){ varCalculatecontractdate=function(){//获取相关数据varrzrq=WfForm.getFieldValue("field10954")......
  • 洛谷P5707 【深基2.例12】上学迟到(Python 3)
    题。审题:1.yyy要花十分钟垃圾分类!不要忘了在总分钟数上加102.如果时或分为个位数,则需要用0在前补位 思路:先把总共需要的分钟数算出来,然后求时和分。如果时大于8,那么再补上24,用来使时间符合格式。 关键点:1.补位:print('%02d'%m),具体看这篇2.注意当分钟数恰好为60倍数的......
  • (C语言)1到50的阶乘之和列表,参考用,洛谷:P1009 [NOIP1998 普及组] 阶乘之和
    1到50列表,阶乘之和S=1!+2!+3!+⋯+n!(n≤50)1::12::33::94::335::1536::8737::59138::462339::40911310::403791311::4395471312::52295631313::674997711314::9392826831315::140160263631316::2232439252431317::37801182062031318::678038552634831319::12842......
  • 洛谷 P2290 [HNOI2004] 树的计数(Prufer序列,Cayley 公式)
    传送门解题思路关于Prufer序列的构造,见OI-wiki这里直接放结论:一个Prufer序列与一个无根树一一对应度数为\(d_i\)的节点在序列中出现了\(d_i-1\)次\(\sum(d_i-1)=n-2\)n个点的完全图的生成树有\(n^{n-2}\)种所以相当于n-2个数(有重复的)进行全排列,答案即为:\[\frac......
  • D. Bracket Coloring
    D.BracketColoring题目大意:给你一组括号序列,要求你将涂颜色括号分类,相同颜色为一组,每组括号按他们出现的顺序可以构成一个漂亮序列如果满足以下条件之一,则括号序列称为优美序列:它是一个规则的括号序列;如果该序列中的字符顺序颠倒,它就会变成一个规则的括号序列。思路:首......
  • 洛谷P3522/POI2011 TEM-Temperature
    涉及知识点:单调队列、贪心、递推前言最近找了点单调队列的题练练手,就遇到这道题,本题对于单调队列弹队尾的时候有别于普通单调队列,一些题解并没有写的很清楚,因此写下这篇题解。题面Link你有一个长度为\(n\)的序列\(A\),告诉你序列中每一个数\(A_i\)的取值范围\(down_i\)......
  • 题解:洛谷P3745 期末考试(整数三分)
    题解:洛谷P3745期末考试(整数三分)题目传送门题目大意:给出\(n\)个同学期望出成绩的时间限制\(a_i\)和\(m\)个学科公布成绩的初始时间\(t_i\),1个同学每多等一天就产生A的不愉快度。问通过一番操作后最小的不愉快度之和是多少?操作有两种:1.让学科X的发布时间晚1天,学科......
  • 洛谷P3805 【模板】manacher
    题目链接:https://www.luogu.com.cn/problem/P3805manacher算法模板题。参考资料:https://oi-wiki.org/string/manacher/示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2.2e7+5;intn;chars[maxn/2],a[maxn];intp[maxn];voidinit(){......
  • 洛谷3281数数
    这一道题给我们最大的启示就是一定要学会固定数字!设\(Pow[i]=B^i\),\(f[i]=\sum_{k=0}^{i}{B^k}\)\(h[i]\)表示所有\(i\)位数字的所有前缀子串的和比如\(123456\)一共有\(6\)位,他的所有前缀子串为\(1,12,123,1234,12345,123456\),他的所有前缀子串和就是这六个数加起来,那么\(h[6......