备战蓝桥杯---DP刷题2

news2025/1/18 8:56:25

1.树形DP:

即问那几个点在树的直径上,类似ROAD那题,我们先求一下每一个子树根的子树的最大值与次大值用d1,d2表示,直径就是d1+d2的最大值,那么我们如何判断是否在最大路径上,其实就是看一下从某一点出发的所有路劲(可以向父节点)的最大2条的和==直径,就在!因此我们还要维护一下向上的最大值(自上而下),我们假设j是i的父节点,此时i如果选择向j走,那么它可以向上即up[j],也可以向下即d1[j],假如d1[j]就是i到J的边,那么我们选d2[j],

下面是AC代码(注意更新时只考虑d1,对于一个父节点,不会用d2,否则就冲突了):

#include<bits/stdc++.h>
using namespace std;
const int N=200010,M=2*N;
int n;
int h[N],e[M],ne[M],idx;
int d1[N],d2[N],p1[N],up[N];
int maxd;
void add(int a,int b){
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
void dfs_d(int u,int fa){
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(j==fa) continue;
        dfs_d(j,u);
        int dis=d1[j]+1;
        if(dis>d1[u]){
            d2[u]=d1[u];
            d1[u]=dis;
            p1[u]=j;
        }
        else if(dis>d2[u]) d2[u]=dis;
        
    }
    maxd=max(maxd,d1[u]+d2[u]);
}
void dfs_u(int u,int fa){
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(j==fa) continue;
        up[j]=up[u]+1;
        if(p1[u]==j){
            up[j]=max(up[j],d2[u]+1);
        }
        else up[j]=max(up[j],d1[u]+1);
        dfs_u(j,u);
    }
}
int main(){
    cin>>n;
    memset(h,-1,sizeof(h));
    for(int i=0;i<n-1;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    dfs_d(0,-1);
    dfs_u(0,-1);
    for(int i=0;i<n;i++){
        int d[3]={d1[i],d2[i],up[i]};
        sort(d,d+3);
        if(d[1]+d[2]==maxd) printf("%d\n",i);
    }
}

2.DP+矩阵快速幂:

首先不考虑规模,我们用f[i][j]表示由i个帅子在一起最上面数字为j的所有合法方案。

我们枚举第i-1个帅子的最上面,总共就是f[i][j]=4(f[i-1][1]+...+f[i-1][6]).

我们考虑限制,我们假设2不能贴1,也就是说最上面是2的话加1后最上面不能是5,那么前面的系数要么是0,要么是4.

又由于每一层的限制完全一样,我们考虑矩阵快速幂。

【f[i][1],f[1][2],f[i][3],f[i][4],f[i][5],f[i][6]】=【f[i-1][1],f[i-1][2],f[i-1][3],f[i-1][4],f[i-1][5],f[i-1][6]】*A(6*6的矩阵)

如何构造矩阵?原来填满了4

假如1与2不能相邻,即1不能5,2不能4,即我们把第一行第5列变为0,同理(2,4)变为0,即题目给了(x,y),我们就把(x,y(对应)),(y,x(对应))变为0。

下面是AC代码:

注意这里我们扩充了含有f的矩阵(为了方便)

#include<bits/stdc++.h>
using namespace std;
const int N=6;
int n,m,mod=1e9+7;
int ge(int x){
    if(x>=3) return x-3;
    return x+3;
}
int t[N][N];
void mul(int c[][N],int a[][N],int b[][N]){

    memset(t,0,sizeof(t));
    for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            for(int k=0;k<6;k++){
                t[i][j]=(t[i][j]+(long long)a[i][k]*b[k][j])%mod;
            }
        }
    }
    memcpy(c,t,sizeof(t));
}
int main(){
    cin>>n>>m;
    int a[N][N];
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            a[i][j]=4;
        }
    }
    while(m--){
        int x,y;
        cin>>x>>y;
        x--,y--;
        a[x][ge(y)]=0;
        a[y][ge(x)]=0;
    }
    int f[N][N]={4,4,4,4,4,4};//其他扩充0
    for(int k=n-1;k;k>>=1){
        if(k&1) mul(f,f,a);
        mul(a,a,a);
    }
    int res=0;
    for(int i=0;i<6;i++) res=(res+f[0][i])%mod;
    cout<<res;
}

3.DP

我们令f[i][j][k][c]表示走到(i,j)已经取了k个物品最后物品价值c的集合。

首先我们按照往下走和往右走来分,我们再分取和不取,取的话再枚举前一个即可。

注意边界f[1][1][0][-1](这里就可以让后面任何数都可)f[1][1][1][w[1]]

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=55,mod=1e9+7;
int n,m,k;
int w[N][N];
int f[N][N][13][14];
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>w[i][j];
            w[i][j]++;
        }
    }
    f[1][1][1][w[1][1]]=1;
    f[1][1][0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int u=0;u<=k;u++){
                for(int v=0;v<=13;v++){
                    int &vv=f[i][j][u][v];
                    vv=(vv+f[i-1][j][u][v])%mod;
                    vv=(vv+f[i][j-1][u][v])%mod;
                    if(u>0&&v==w[i][j]){
                        for(int c=0;c<v;c++){
                            vv=(vv+f[i-1][j][u-1][c])%mod;
                            vv=(vv+f[i][j-1][u-1][c])%mod;
                        }
                    }
                }
            }
        }
    }
    int res=0;
    for(int i=0;i<=13;i++) res=(res+f[n][m][k][i])%mod;
    cout<<res;
}

4.DP

我们假设第一项x,第二项x+d1,第三项x+d1+d2.

nx+(n-1)d1+(n-2)d2+...dn-1=s

此时x属于任意整数,我们转化一下,x=(s-(n-1)d1-...)/n为整数。

于是我们只要让(n-i)di%n求和与s%n相同,这样子就是组合问题。

我们令f[i][j]表示所有只考虑前i项当前和%n==j的方案,

易得转移方程:f[i][j]=f[i-1][(j-ia)%n]+f[i-1][(j+ib)%n].

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt】:常用控件(四:显示类控件)

常用控件 一.Lable二.LCD Number 一.Lable QLabel 可以⽤来显⽰⽂本和图⽚. 代码⽰例:显⽰不同格式的⽂本 代码⽰例:显⽰图⽚ 此时,如果拖动窗⼝⼤⼩,可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化 为了解决这个问题,可以在Widget中重写resizeEvent函数。当用户把窗口从A拖…

五、企业级架构之Nginx负载均衡

一、负载均衡技术 1、介绍&#xff1a; 负载均衡技术&#xff08;Load Balance&#xff09;是一种概念&#xff0c;其原理就是把分发流量、请求到不同的服务器&#xff0c;平均分配用户请求。 2、作用&#xff1a; ① 流量分发&#xff0c;请求平均&#xff0c;提高系统处理…

GPT3, llama2, InternLM2技术报告对比

GPT3&#xff08;September 22, 2020&#xff09;是大语言应用的一个milestone级别的作品&#xff0c;Llama2&#xff08;February 2023&#xff09;则是目前开源大模型中最有影响力的作品&#xff0c;InternLM2&#xff08;2023.09.20&#xff09;则是中文比较有影响力的作品。…

网络中的网络-NiN

NiN NiN的网络结构NiN与传统CNN的区别NiN的特点总结 NiN&#xff08;Network in Network&#xff09;是由Min Lin、Qiang Chen和Shuicheng Yan等人在2013年提出的一个深度卷积神经网络模型。NiN的设计思想是在传统的卷积神经网络&#xff08;CNN&#xff09;结构中引入“网络中…

Matlab学习书籍分享

一、什么是Matlab​​&#xff1f; Matlab是一种用于数值计算、科学计算、工程设计和数据分析的高级编程语言。它提供了丰富的数学函数库&#xff0c;支持矩阵运算、信号处理、图像处理、机器学习等多种应用领域。Matlab还具有强大的图形界面&#xff0c;可以方便地进行数据可…

计算机组成结构2

概念 存储系统 存在成本-速度-容量之前的矛盾问题 寄存器–cache–内存–硬盘–外存储 局部性原理 时间局部&#xff1a;相邻的时间访问同一个数据空间局部&#xff1a;相邻的空间地址会被连续访问 cache cpu与主存之间&#xff0c;命中cache会不需要访问主存 映射方法&…

echarts地图自定义label属性以及引入china.js

效果图: 要点1:calc函数 重点&#xff1a;在于mapChart的height可以写成函数以便适配不同尺寸&#xff1b; <div class"content-map"><div class"wai-top-box" style"width: 100%; height: 100%"><div id"mapChart" s…

四核8g服务器价格多少钱?

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐

前言 最近在开发swing客户端时候碰到一个棘手的问题&#xff1a; Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐如果是vue或者react&#xff0c;一搜百度什么都出来了&#xff0c;swing的话&#xff0c;嗯。。。资料有点少而且大部分是stack overflow上面的…

数据仓库的建立

实验 目的 熟悉Linux系统、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系统和软件的安装和使用&#xff1b; 了解大数据处理的基本流程&#xff1b; 熟悉数据预处理方法&#xff1b; 熟悉在不同类型数据库之间进行数据相互导入导出&#xff1b; 熟悉使用R语言进行可视化…

ChatGPT 在做什么,为什么有效?

原文&#xff1a;What Is ChatGPT Doing … and Why Does It Work? 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上&#xff0c;这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…

『大模型笔记』LLMs入门:从头理解与编码LLM的自注意力机制

LLMs入门&#xff1a;从头理解与编码LLM的自注意力机制 这里直接引用我语雀上的的文章&#xff1a;《从头理解与编码LLM的自注意力机制》

第18讲:数据在内存中的存储

⽬录 1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 ——————————————————————————————————————————— 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…

Ansible批量操作(上传文件、删除文件指定文件内容、执行sh文件等)

官方网站 https://www.ansible.com/ 一、Ansible 简介 1、Ansible是新出现的自动化运维工具&#xff0c;完全基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行…

MinGW使用std::thread报错error: ‘thread‘ is not a member of ‘std‘

目录 问题描述简单的测试代码报错及解决 问题描述 在windows上用vscode编写c代码进行编译时&#xff0c;一直上报error: ‘thread’ is not a member of std’的错误&#xff0c;搜索该错误上报都是说c版本不匹配&#xff0c;然后我在task.json里面添加了-stdc11之后还是报错&…

Spring Boot | Spring Boot的“数据访问“、Spring Boot“整合MyBatis“

目录: 一、Spring Boot”数据访问概述“二、Spring Boot”整合MyBatis”1. 基础环境搭建 (引入对应的“依赖启动器” 配置数据库的“相关参数”)① 数据准备 (导入Sql文件)② 创建项目&#xff0c;引入相应的启动器&#xff0c;编写数据库对应的“实体类”③额外添加pom.xml文…

Nacos下载安装与配置(linux)

一、Nacos下载 官网地址&#xff1a;home (nacos.io) 点击☆&#xff0c;跳转至Github页面。 点击Tags&#xff0c;跳转至版本选择页面&#xff0c;此处选择2.2.0版本。 点击nacos-server-2.2.0.tar.gz&#xff0c;进行下载。 二、将安装包上传至服务器 1.将安装包上传至/usr…

面试官:为什么忘记密码要重置,而不是告诉我原密码?

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 最近有个同学在面试中遇到了一个很有意思的问题&#xff0c;我相信大多…

SON序列化解决方案

JSON&#xff08;JavaScript Object Notation&#xff09;是一种用于数据交换的轻量级数据格式。在我们日常Python编程中&#xff0c;通常可以使用内置的json模块来进行JSON序列化和反序列化。那么关于使用json模块进行JSON序列化和反序列化的问题解决方案&#xff0c;可以参考…

0基础如何进入IT行业

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 对于没有任何相关背景知识的人来说&#xff0c;如何才能成…