DP(1500-1700)(刷题)

1.状态机模型:https://codeforces.com/contest/1984/problem/C2

记一下max与min状态转移即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; 
ll a[200010],t,n;
ll dp[200010][2];//dp[i][0]表示min,dp[i][1]表示max 
ll cnt[200010][2];//cnt[i][0]表示取到dp[i][0]的方法数,cnt[i][1]表示取到dp[i][1]的方法数 
ll mod=998244353;
int main()
{cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];dp[1][0]=a[1];if(a[1]>=0) cnt[1][0]=2;else cnt[1][0]=1; if(a[1]>=0) cnt[1][1]=2;else cnt[1][1]=1; dp[1][1]=abs(a[1]);for(int i=2;i<=n;i++){dp[i][0]=(dp[i-1][0]+a[i]);if(dp[i][0]>=0) cnt[i][0]=cnt[i-1][0]*2%mod;else cnt[i][0]=cnt[i-1][0];dp[i][1]=max(abs(dp[i-1][0]+a[i]),dp[i-1][1]+a[i]);if(dp[i][1]==dp[i-1][1]+a[i]&&dp[i][1]==abs(dp[i-1][0]+a[i])){if(dp[i-1][1]!=dp[i-1][0]){cnt[i][1]=2*cnt[i-1][1]%mod;if(dp[i-1][0]+a[i]>=0) cnt[i][1]=(cnt[i][1]+2*cnt[i-1][0]%mod)%mod;else cnt[i][1]=(cnt[i][1]+cnt[i-1][0])%mod;}else{cnt[i][1]=2*cnt[i-1][1]%mod;}}else if(dp[i][1]==dp[i-1][1]+a[i]){cnt[i][1]=2*cnt[i-1][1]%mod;}else{if(dp[i-1][0]+a[i]>=0) cnt[i][1]=2*cnt[i-1][0]%mod;else cnt[i][1]=cnt[i-1][0];}}cout<<cnt[n][1]<<endl;}
}

2.DFS:https://codeforces.com/contest/1975/problem/D

首先先让红蓝相遇,然后再遍历一遍树,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
vector<int> edge[200010];
int t,n,a,b,x,y;
int cnt;
int track[200010];
int h[200010];
int dis;
void dfs(int x,int cnt1,int fa)//两点相差的距离 
{if(a==x){cnt=cnt1;track[a]=fa;return;}for(int i=0;i<edge[x].size();i++){int son=edge[x][i];if(son==fa) continue;track[son]=x;dfs(son,cnt1+1,x);}
}
void dfs1(int x,int fa)//建树高度 
{h[x]=0;for(int i=0;i<edge[x].size();i++){int son=edge[x][i];if(son==fa) continue;dfs1(son,x);h[x]=max(h[x],h[son]+1);}
}
int dfs3(int x,int fa){int res=0;for(int i=0;i<edge[x].size();i++){int son=edge[x][i];if(son==fa) continue;res+=2+dfs3(son,x);}return res; 
} 
int dfs2(int x,int fa){int k=-1;//记录最长链int lon=-1;for(int i=0;i<edge[x].size();i++){int son=edge[x][i];if(son==fa) continue;if(h[son]>lon){lon=h[son];k=i;}}int res=0;for(int i=0;i<edge[x].size();i++){int son=edge[x][i];if(son==fa) continue;if(i==k) res+=1+dfs2(son,x);else res+=dfs3(son,x)+2;}return res; 
}
int find(int start,int dis){if(dis==0) return start;return find(track[start],dis-1); 
}
int main()
{cin>>t;while(t--){cin>>n;cin>>a>>b;dis=0;vector<int>::iterator it;memset(edge,0,sizeof(edge));for(int i=1;i<=n-1;i++){cin>>x>>y;edge[x].push_back(y);edge[y].push_back(x);}//找出蓝点到红点的距离cnt=0;dfs(b,0,-1); dis=cnt/2;int ck=find(a,dis);dfs1(ck,-1);if(cnt%2==0) dis+=dfs2(ck,-1);else dis+=1+dfs2(ck,-1); cout<<dis<<endl;}
}

3.区间DP:https://codeforces.com/contest/1969/problem/C

我们令dp[i][j]表示前i个用<=j次的min,对于状态的更新,我们考虑dp[i][k]的第i个元素,我们发现假如没有次数限制对于长度n我们用最坏用n-1可以更新到min,回过头来,假如进行t次操作,一定可以让最后长度t+1的一段变成这个区间中最小的值,于是我们枚举t,它可以让最后t+1个变成其中的min,具体地,我们不妨令k=2(k>=3同理),那么所有的答案可能的情况就是倒数3个变成其中min,倒数2个变成其中min以及最后一个没有变的3种情况,消耗的次数分别为2,1,0(最优答案一定是其中一个)

或者说,我们从集合的角度分析,所有涉及到a[i]的可能(没涉及的就是dp[i-1][j]+a[i]):

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,n,k;
ll a[300010][13];
ll b[300010];
ll dp[300010][11];
int main()
{cin>>t;while(t--){cin>>n>>k;for(ll i=1;i<=n;i++) cin>>b[i];//搜索每一个点的前k+1个内的minfor(ll i=1;i<=n;i++){ll ans=b[i];for(ll j=1;j<=k+1;j++){ans=min(ans,b[max((ll)1,i-j+1)]);a[i][j]=ans;}}/*for(int i=1;i<=n;i++){cout<<endl;for(int j=1;j<=k+1;j++) cout<<a[i][j]<<" ";}*///开始DPfor(ll i=0;i<=k;i++) dp[1][i]=b[1];for(ll i=2;i<=n;i++){for(ll j=0;j<=k;j++){dp[i][j]=dp[i-1][j]+b[i];for(ll w=1;w<=j;w++){if(i-(w+1)<0){dp[i][j]=min(dp[i][j],a[i][k+1]*i);}else dp[i][j]=min(dp[i][j],dp[i-w-1][j-w]+a[i][w+1]*(w+1));}}}cout<<dp[n][k]<<endl; }
}

4.模拟(类似DP转移的思想):https://codeforces.com/contest/1976/problem/C

我们先枚举第n+m+1走的答案,然后对于前面的一个人退出,看看有没有想选这个但是被迫走的,有的化取最近的更新,下面的一个空位由n+m+1填,反之若没有就只好让n+m+1来填,同时从后往前依次更新被迫的人的位置。下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,a[300010],b[300010],n,m;
bool wh[300010];
ll cnt1,cnt2;
int main()
{cin>>t;while(t--){ll ans[200020]={0};cin>>n>>m;for(ll i=1;i<=n+m+1;i++) cin>>a[i];for(ll i=1;i<=1+n+m;i++) cin>>b[i];//计算dp[n+m+1]ll cnt1=0,cnt2=0;ll res=0;for(ll i=1;i<=n+m;i++){if(a[i]>b[i]&&cnt1<n){cnt1++;wh[i]=0;res+=a[i];}else if(a[i]>b[i]){cnt2++;wh[i]=1;res+=b[i];}else if(a[i]<b[i]&&cnt2<m){cnt2++;wh[i]=1;res+=b[i];}else{cnt1++;wh[i]=0;res+=a[i];}}ans[n+m+1]=res;//转移ll ca=n+m+1,cb=n+m+1;//ca:最先被迫编程的 for(ll i=n+m;i>=1;i--){ll hh=res;if(cb==n+m+1&&wh[i]==0) hh+=a[n+m+1]-a[i];else if(ca==n+m+1&&wh[i]) hh+=b[ca]-b[i];else if(wh[i]) hh+=abs(a[ca]-b[ca])-b[i]+a[n+m+1];else  hh+=abs(a[cb]-b[cb])-a[i]+b[n+m+1];if(wh[i]&&a[i]>b[i]) cb=i;if(!wh[i]&&a[i]<b[i]) ca=i;ans[i]=hh;}for(ll i=1;i<=n+m+1;i++) cout<<ans[i]<<" ";cout<<endl;}
}

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

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

相关文章

掌握这些技巧,让你成为画册制作高手

在数字化的时代背景下&#xff0c;电子画册以其便捷的传播方式、丰富的视觉表现形式&#xff0c;赢得了大众的喜爱。它不仅能够在个人电脑上展现&#xff0c;还能通过智能手机、平板电脑等多种移动设备随时随地被访问和浏览。这种跨平台的支持&#xff0c;使得无论你身处何地&a…

volatile关键字解析

一、volatile介绍 volatile是Java提供的一种轻量级的同步机制&#xff0c;在并发编程中&#xff0c;它也扮演着比较重要的角色。同synchronized相比&#xff08;synchronized通常称为重量级锁&#xff09;&#xff0c;volatile更轻量级&#xff0c;相比使用synchronized所带来的…

leetcode热题100.分割等和子集(动态规划)

分割等和子集 Problem: 416. 分割等和子集 思路 我选择使用动态规划的方法来解题。我们需要判断是否可以将数组分割成两个子集&#xff0c;使得这两个子集的和相等。这个问题可以转化为在数组中找到一个子集&#xff0c;使得其和等于数组总和的一半。 解题过程 首先&#xf…

【Django】网上蛋糕商城后台-商品管理

1.商品管理功能 当管理员点击商品管理时&#xff0c;发送服务器请求 path(admin/goods_list/, viewsAdmin.goods_list), # 处理商品列表请求 def goods_list(request):try:type request.GET["type"]except:type 0try:ym request.GET["ym"]except:ym …

5大常用的回归测试工具介绍

回归测试工具介绍 以下是一些可用于创建和执行回归测试的工具。但是&#xff0c;在决定使用哪些产品之前&#xff0c;应彻底研究每种产品的要求。 Selenium Selenium 是一个开源 Web 自动化测试工具&#xff0c;用于测试网站和 Web 应用程序。它被认为是用于Web 应用程序测试的…

路径规划 | 基于DQN深度强化学习算法的路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 DQN路径规划算法 基于深度强化学习算法的路径规划 matlab2023b 栅格环境&#xff0c;走迷宫&#xff0c;可以通过窗口界面方便观察交互过程&#xff0c;代码注释详尽。 程序设计 完整源码和数据私信博主回复基于DQN深…

【Linux信号】信号的保存、信号在内核中的表示、信号集操作函数、sigprocmask、sigpending

目录 信号在内核中的表示信号阻塞的理解 sigset_t 信号集操作函数 sigprocmask sigpending sigprocmask和sigpending都是系统调用 我们先来了解一下关于信号的一些常见概念&#xff1a; 实际执行 信号的处理动作 称为信号递达。 信号从产生到递达的之间的状态称为信号未决…

场外个股期权交割日是每个月几号?怎么参与场外个股期权?

今天带你了解场外个股期权交割日是每个月几号&#xff1f;怎么参与场外个股期权&#xff1f;在进行期权交易之前&#xff0c;投资者需要选择一个可靠的期权交易平台。 个股场外期权交易是指在股票交易所以外的场所进行的期权交易。期权是一种约定&#xff0c;根据该约定&#…

Docker网络模式和Cgroup资源限制

目录 1、Docker网络 &#xff08;1&#xff09;Docker网络实现原理 查看容器的输出和日志信息 2、Docker 的网络模式 查看docker列表 &#xff08;1&#xff09;网络模式详解 1&#xff09;host模式 2&#xff09;container模式 3&#xff09;none模式 4&#xff09;br…

小程序-3(页面导航+页面事件+生命周期+WXS)

目录 1.页面导航 声明式导航 导航到tabBar页面 导航到非tabBar页面 后退导航 编程式导航 后退导航 导航传参 声明式导航传参 编程式导航传参 在onload中接收导航参数 2.页面事件 下拉刷新 停止下拉刷新的效果 ​编辑 上拉触底 配置上拉触底距离 上拉触底的节…

spring security源码追踪理解(一)

一、前言 近期看了spring security相关的介绍&#xff0c;再加上项目所用若依框架的底层安全模块也是spring security&#xff0c;所以想从源码的角度加深下对该安全模块的理解&#xff08;看源码之前&#xff0c;我们要先有个意识&#xff0c;那就是spring security安全模块主…

一文-深入了解Ansible常见模块、安装和部署

1 Ansible 介绍 Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的&#xff08;集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点&#xff09;自动化运维工具, 其功能实现基于ss…

Linux中nohup(no hang up)不挂起,用于在系统后台不挂断地运行命令,即使退出终端也不会影响程序的运行。

nohup的英文全称是 no hang up&#xff0c;即“不挂起”。这个命令在Linux或Unix系统中非常有用&#xff0c;主要用于在系统后台不挂断地运行命令&#xff0c;即使退出终端也不会影响程序的运行。默认情况下&#xff08;非重定向时&#xff09;&#xff0c;nohup会将输出写入一…

美国银行:高息下的稳健

“四大银行”财报悉数登场&#xff0c;折射美国经济忧虑。 今天我们来聊——美国银行 上周五摩根大通、富国银行和花旗银行发布了二季度财报&#xff0c;结果不及预期&#xff0c;股价都是一个走法&#xff0c;跌。反倒是姗姗来迟的美国银行Q2业绩超预期&#xff0c;大涨超5%。…

统计学13——时间序列分析

目录 知识结构 ​编辑内容精读 1.时间序列及其分开类 2.描述性分析 3.时间序列预测 3.1预测过程 3.2平稳时间序列 3.3趋势型序列 3.4复合型序列 名词解释 知识结构 内容精读 1.时间序列及其分开类 时间序列顾名思义就是按时间顺序观察排列而成的序列&#xff0c;根…

苍穹外卖图片不显示

上传图片到自己的阿里云oss中&#xff0c;然后对应链接放到数据库中 显示成功

Linux——开机重启、用户登录注销、用户管理、运行级别、帮助指令

目录 关机&重启命令 用户登录&注销 用户管理 用户的添加和删除 查询用户信息指令 切换用户 查看当前登录用户 用户组 用户和组相关的文件 运行级别 基本介绍 设置默认运行级别 ​编辑​编辑 找回root密码 帮助指令 关机&重启命令 用户登录&注销…

Linux工具篇:gdb(调试工具)+ makefile(自动化构建工具)

目录 前言&#xff1a; Linux调试器-gdb使用&#xff1a; Linux项目自动化构建工具-make/Makefile&#xff1a; 问题&#xff1a; 为什么makefile对最新的可执行程序&#xff0c;默认不想不想重新形成呢&#xff1f; make是如何知道到我的程序需要被编译的呢&#xff1f; …

监控系统怎样做?

监控类型自底向上分为资源监控、服务监控和业务监控。希望打造公司级的监控系统最好的时机是系统规划时&#xff0c;如果把监控设计往后放&#xff0c;将会面临一个巨大的难题&#xff1a;推行和现有不兼容的规范。 三种监控类型 资源监控 这个相对简单&#xff0c;随着k8s的兴…

【个人笔记】685. 冗余连接 II 的解释(并查集)

一棵树有n个点和n条边&#xff0c;返回一条能删除的边&#xff0c;使得剩下的图是有 n 个节点的有根树。 解释&#xff1a; 注意不冗余的有根树的特性&#xff01;**根节点入度为0&#xff0c;其余结点只有一个入度&#xff01;**所以冗余的两种情况如下&#xff1a; &#xff…