首页 > 其他分享 >DP难题:颜色的长度

DP难题:颜色的长度

时间:2023-11-09 15:45:29浏览次数:34  
标签:难题 p2 q2 颜色 int second 序列 长度 DP

颜色的长度 Color Length

题面翻译

输入两个长度分别是 $n$ 和 $m(n,m\leq 5000)$ 的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部。

例如,两个颜色序列 GBBYYRRGB,至少有两种合并结果:GBYBRYRGBYRRGGBBYB。对于每种颜色来说其跨度L(c)等于最大位置和最小位置之差。例如,对于上面两种合并结果,每种颜色的L(c)和所有L(c)的总和如图9-8所示

Color G Y B R -> Sum
L(c)Scenario 1 7 3 7 2 -> 19
L(c)scenario 2 1 7 3 1 -> 12

你的任务是找一种合并方式,使得所有 $L(c)$ 的总和最小

感谢 @Bruce·Darwin·Xu 提供的翻译。

题目描述

PDF

输入格式

输出格式

 

 

这道题是一个LCS的变形,设 f[i][j] 1到i,1到j 的最小费用,我们需要计算出 1到i,1到j 下,有哪些颜色已经开始而且尚未结束。可以这么想:有哪些颜色是前缀 1到i,1到j 有 ,后缀 i+1到n,j+1到m也有的,那不就可以求出 有哪些颜色已经开始 还尚未结束的个数吗?方程显然,代码里面都写得很清楚。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define fo(i,a,b) for(int i=(a);i<(b);++i)
using namespace std;
const int N=5e3+5,INF=0x3f3f3f3f;
#define PII pair<int,int>
 
PII p2[N],q2[N];
int g[N][N],f[N][N];
int cnt1(int x){
    int ans=0;
    while(x){
        ans+=(1&x);
        x>>=1;
    }
    return ans;
}
 
void solve(){
    string p,q;
    cin>>p>>q;
    int n=p.size(),m=q.size();
    p='#'+p,q='#'+q;
    //prework
    p2[0]=p2[n+1]={0,0};q2[0]=q2[m+1]={0,0};
    for(int i=1;i<=n;i++)
        p2[i].first=(p2[i-1].first|(1<<(p[i]-'A')));
    for(int i=1;i<=m;i++)
        q2[i].first=(q2[i-1].first|(1<<(q[i]-'A')));
    for(int i=n;i>=1;i--)
        p2[i].second=(p2[i+1].second|(1<<(p[i]-'A')));
    for(int i=m;i>=1;i--)
        q2[i].second=(q2[i+1].second|(1<<(q[i]-'A')));
    for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++){
            g[i][j]=cnt1((p2[i].first|q2[j].first)&(p2[i+1].second|q2[j+1].second));
        }
    //dp
    for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++){
            if(!i&&!j) {f[i][j]=0;continue;}
            int &v=f[i][j]; v=INF;
            if(i) v=min(v,f[i-1][j]+g[i-1][j]);
            if(j) v=min(v,f[i][j-1]+g[i][j-1]);
        }
    cout<<f[n][m]<<endl;
}
 
int main(){
    //std::ios::sync_with_stdio(0);cin.tie(0);
    int T;cin>>T;
    while(T--) solve();
}

标签:难题,p2,q2,颜色,int,second,序列,长度,DP
From: https://www.cnblogs.com/Kopicy/p/17821842.html

相关文章

  • c++数组最大长度(干货)
    ​    在编译器里,每种类型的变量定义数组的时候都有一个数组大小,而这个大小对于不同的变量而言有不同的上限,这里的最大长度更准确的来说应该是系统堆的最大值。字符类型数组一个字符占1byte大小,八位,所以,理论上,在一个64位的编译器中,一个字符数组的最大长度是2147483648,......
  • DP 与计数
    NFLSOJACF294CShaassandLight考虑初始已点亮的灯将所有剩下的灯划分成的连续段。除开头结尾外,每个长为\(l\)的连续段有\(2^l\)种操作序列。开头结尾的连续段只有\(1\)种操作序列。从前往后将所有的操作序列归并到全局的操作序列里,拿组合数随便乱搞搞就好了。代码......
  • 20231108数数与dp题笔记
    数数与dpCF294CShaassandLights记被分成的\(m+1\)段每一段的长度为\(l_i\)答案为\[\frac{(n-m)!}{\prod\limits_{i=1}^{m+1}l_i!}\times\prod\limits_{i=1}^{m+1}2^{l_i-1}\]前面是不同段之间的顺序打乱,后面是每一段中前\(l_i-1\)个操作各有\(2\)个选择CF1753CW......
  • .NET 8 IEndpointRouteBuilder详解
    Map​ 经过对WebApplication的初步剖析,我们已经大致对Web应用的骨架有了一定了解,现在我们来看一下HelloWorld案例中仅剩的一条代码:app.MapGet("/",()=>"HelloWorld!");//3添加路由处理​ 老规矩,看签名:publicstaticRouteHandlerBuilderMapGet(thisIEndpointRout......
  • 浪潮信息彭震:加速智算系统创新,切实解决大模型算力“买不起、建不了、算不好”难题
    2023年,生成式人工智能的爆发带来了历史性产业机遇,正在逐步改造重塑社会、经济、文化等各个领域。GPT-4、Llama2、文心、源等大模型在写文章、对话、企划、绘画、写代码等很多领域已经表现出了让人惊艳的创作能力。未来,AIGC与数字经济、实体经济的深度融合,还将创造出更多颠覆性的社......
  • SP15637 GNYR04H - Mr Youngs Picture Permutations(线性 dp)
    题目求方案数,考虑dp——状态设计和边界——题目告诉了一个很显然的性质:每一排从左至右保证高度单调递减每一列从后往前保证高度单调递减那么可以发现,对于每一行,每一列,一定是按高度顺序插入,并且是连续插入,因为如果不连续,就无法保证单调递减的性质同时,它给出了另一个性......
  • 最大单词长度乘积
    题目概述:给你一个字符串数组words,找出并返回length(words[i])*length(words[j])的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回0。解题思路1:暴力做法+小优化。直接两重循环枚举所有组合,再写一个函数判断两个字符串是否含有相同字符。时间复杂度:\(......
  • 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为
    一个报表的查询,用ajax调用的Service,查询条件没有问题,后台也能返回数据,就一直返回Error提示,F12看到是因为返回json时出错了 在web.config的configuration加以下代码即可解决<system.web.extensions><scripting><webServices><jsonSerializationmaxJs......
  • P2196-DP【黄】
    清醒了一点后我又写了一道黄色DP题,做出来了,还行,开心不少了...中途暴露出一些问题1、深搜过程中既然用了二维数组,那么深搜时就应该用二维循环取最优解,而不是只从最后一行中进行一维循环取最优解。2、dfs递归的过程中应该用dfs!!!不应该像个智障一样的忘了用dfs,直接用dp数组忘了递归......
  • 国产MIPI转eDP方案|低成本替代LT6911方案|CS5523规格书
    ASLCS5523是MIPI DSI输入、DP/eDP输出转换芯片。MIPIDSI最多支持4个通道,每个通道的最大运行速度为1.5Gps。对于DP1.2输出,它由4个数据通道组成,支持1.62Gbps和2.7Gbps的链路速率。支持1.62Gbps和2.7Gbps的链路速率。它支持2560的最高分辨率*1440@60Hz.它只能使用单个1.8V电源,以......