马上蓝桥杯了,干货总结动态规划专题,祝你考场爆杀(基础篇)猫粮规划 接苹果 魔族密码 最大正方形 最大正方形 2 奶牛比赛

news2024/11/26 16:59:59

目录

猫粮规划

思路: 

接苹果

思路:

魔族密码 

思路: 

最大正方形

思路: 

最大正方形 2

思路: 

奶牛比赛 

​编辑 思路:


        

        

猫粮规划

思路: 

 每种食物都有两种状态,记忆化dfs当然可以,但是你是否觉得这个题很想之前讲过的“小A点菜 ”?(【算法每日一练]-动态规划 (保姆级教程 篇2)#尼克的任务 #数楼梯 #小A点菜-CSDN博客)那道题问的是对于那些菜要花光她的钱,一共有多少方案?这道题问的是一个区间罢了,那么既然题目意思都这么像,跑不了解法也基本一致:

还是设置f[i][j]表示遍历i个东西获得j能量对应的方案数,

f[i][j]=f[i-1][j]+f[i-1][j-a[i]]

那么最终直接把符合题意的j全部加起来就行了。代码如下:(注意好初始化就行)

#include <bits/stdc++.h>
using namespace std;
int ans,n,l,r,a[50],f[50][500];
int main(){
	cin>>n>>l>>r;
	for(int i=1;i<=n;i++)cin>>a[i],f[i][0]=1;
	f[0][0]=1;
	for(int i=1;i<=n;i++)
	for(int j=0;j<=r;j++){
		f[i][j]=f[i-1][j];
		if(j-a[i]>=0)f[i][j]+=f[i-1][j-a[i]];
	}
	for(int j=l;j<=r;j++){
		ans+=f[n][j];
	}
	cout<<ans;
}

既然看到转移仅用到了i-1行的数据,那么i放到外面就可以又降一维,变成这样:

    for(int i=1;i<=n;i++)
	for(int j=r;j>=0;j--){
		if(j-a[i]>=0)f[j]+=f[j-a[i]];
	}

就变成了如下的一维解法:

#include <bits/stdc++.h>
using namespace std;
int ans,n,l,r,a[50],f[500];
int main(){
	cin>>n>>l>>r;
	for(int i=1;i<=n;i++)cin>>a[i];f[0]=1;
	for(int i=1;i<=n;i++)
	for(int j=r;j>=a[i];j--){
		f[j]+=f[j-a[i]];
	}
	for(int j=l;j<=r;j++){
		ans+=f[j];
	}
	cout<<ans;
}

        

        

接苹果

思路:

 还是“小A点菜”的变形题,我们不妨设置1表示站在左边树下,2表示在右边数下。然后设置t表示遍历到了多长时间,j表示已经移动多少次。

然后就出来了:f[i][j][1]表示在第i秒在左边树下当前一件移动j次最多接多少个苹果,f[i][j][2]表示在第i秒在右边树下已经移动j次最多接多少个苹果。然后找关系:

 如果当前左树下掉苹果:有

f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][2])+1;

f[i][j][2]=max(f[i-1][j][2],f[i-1][j-1][1]);

当前在右树下同理。

有两个坑注意一下:

一个是最开始在左边树下,那么j为偶数一定还是在左边,奇数一定是右边

另一个是移动次数最多的不一定是答案!

#include <bits/stdc++.h>
using namespace std;
int ans,t,w,f[1010][50][3],a[1010];
int main(){
	cin>>t>>w;
	for(int i=1;i<=t;i++)cin>>a[i];
	for(int i=1;i<=t;i++)
	for(int j=0;j<=w;j++){
		if(a[i]==1){
			if(j%2==0) f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][2])+1;
			else f[i][j][2]=max(f[i-1][j][2],f[i-1][j-1][1]);
			
		}
		if(a[i]==2){
			if(j%2==1) f[i][j][2]=max(f[i-1][j][2],f[i-1][j-1][1])+1;
			else f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][2]);
			
		}
	
	}
	for(int i=1;i<=w;i++)
	ans=max(ans,max(f[t][i][1],f[t][i][2]));
	cout<<ans;//不一定移动的次数越多接到的就越多
}

        

        

魔族密码 

思路: 

注意到词链就是下面的词一定要完全包含前面的,那么不妨把前面的单词看成一个字符,后面多出来的单词也看成一个字符,那就转化成了最长上升子序列了吧。

不过是在转移条件变成了前面的单词时候是后面的前缀。

设置f[i]表示第i个单词结果的词链所包含的最长单词数

f[i]=max(f[j]+1)   j<i      

和最长上升子序列一样,我们的答案不一定是以最后一个字符结尾的,那么就需要都遍历一遍。

补充一下STL:substr(begin,length) 

#include <bits/stdc++.h>
using namespace std;
int n,f[2010],ans;
string s[2010];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>s[i];
	for(int i=1;i<=n;i++){
		f[i]=1;
		for(int j=1;j<i;j++){
			if(s[j]==s[i].substr(0,s[j].size()))
				f[i]=max(f[j]+1,f[i]);	
		}
		ans=max(f[i],ans);
	}
	cout<<ans;
}

        

        

最大正方形

思路: 

这个转移方程还是挺难发现的。

一开始设置f[i][j]表示以<i,j>为右下顶点的不含0的最大正方形,

那么容易发现f[i][j]=min(f[i-1][j],f[i][j-1])+1,然后发现f[i-1][j]一旦为1,就不对了,主要是没有考虑f[i-1][j-1],那么正确的转移式子应该是:

f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1

注意:
1,不要见到min就把值初始化成iNF,一定要结合f的具体含义
2,其实应该设置每个格子的f初始化值都是1,不过很麻烦,而且我们只需要在转移的时候把这个1加上即可,这样子是等价的。

3,因为每个格子更新一次就会正确,那么就可以直接获取答案

#include <bits/stdc++.h>
using namespace std;
int ans,inf,a[105][105],f[105][105];
int main(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
		cin>>a[i][j];
		if(a[i][j])f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;
		if(f[i][j]!=inf)ans=max(ans,f[i][j]);
	}
	cout<<ans;
}

        

        

最大正方形 2

 

思路: 

如果我们设置f[i][j]表示<i,j>为右下角的最大正方形,因为不清楚<i,j>是0还是1,所以不好转移。

所以设置f[i][j][1]表示<i,j>=1为右下角的最大正方形,f[i][j][0]表示<i,j>=0

f[i][j][1]=min(min(f[i-1][j][0],f[i][j-1][0]),f[i-1][j-1][1])+1;

f[i][j][0]=min(min(f[i-1][j][1],f[i][j-1][1]),f[i-1][j-1][0])+1;

因为每个格子更新一次就会正确,那么就可以直接获取答案

#include <bits/stdc++.h>
using namespace std;
int ans,a[1505][1505],f[1505][1505][2];
int main(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
		scanf("%d",&a[i][j]);
		if(a[i][j]) f[i][j][1]=min(min(f[i-1][j][0],f[i][j-1][0]),f[i-1][j-1][1])+1;
		else f[i][j][0]=min(min(f[i-1][j][1],f[i][j-1][1]),f[i-1][j-1][0])+1;
		ans=max(ans,max(f[i][j][0],f[i][j][1]));
	}
	cout<<ans;
}

        

        

奶牛比赛 

 思路:

本题挺考思维的,首先要明确题意:我们可以确定这个点的排名,当且仅当它和其余所有点的关系都已经知道了

我们知道floyd可以通过求最短路来判断两点之间连通性,那么当我们设置f[i][j]为1表示i和j之前有关系,如果u点和任意点都有关系,那么u点就算确定了。

为什么呢?

样例一
5 6
5 2
2 3
2 4
2 1
3 4
4 1
样例二
5 6
5 2
2 3
2 4
2 1
3 4
1 4

左边是样例一:你会发现5点能到其余点,那么它和其余点的关系就确定了,2能到3,4,1而5能到2,那么2和其余点的关系也确定了……

右边是样例而:你发现5点2点都可以确定,对于3点,它无法到1而1也无法到3,那么3点是不确定的。懂了吗? 

那么剩下的就是对floyd进行一下小修改:

设置f[i][j]表示<i,j>可以到达(i->j或j->i都行)  那么有

f[i][j]=f[i][j]||f[i][k]&&f[k][j](||表示只要有一个联通方式即可)

#include <bits/stdc++.h>
using namespace std;
int f[200][200];
int n,m,ans=0;
int main()
{
    cin>>n>>m;int x,y;
    for(int i=1;i<=m;++i){
		cin>>x>>y;f[x][y]=1;
    }
    for(int k=1;k<=n;++k)
      for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        f[i][j]=f[i][j] || (f[i][k] && f[k][j]);
    for(int i=1;i<=n;++i){
        int a=1;
        for(int j=1;j<=n;++j){
            if(i==j) continue;//一定要忽略对角线
            else a=a && (f[i][j] || f[j][i]);//千万不要忘了还有f[j][i]
        }
        ans+=a;
    }
    printf("%d\n",ans);
    return 0;
}

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

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

相关文章

以太网/USB 数据采集卡 24位16通道 labview 256K同步采样

XM7016以太网SUB数据采集卡 XM7016是一款以太网/USB高速数据采集卡&#xff0c;具有16通道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率256ksps. 16通道同步共计4.096Msps、精密前置增益放大、集成IEPE/ICP硬件支持的特点。本产品采用了多个高精度24位ADC单元…

<QT基础(4)>QLabel使用笔记

Label 前面的文章里面把QLabel批量引入ScrollArea作为预览窗口&#xff0c;这篇把图像填充到QLable的PixelMap展示指定图像。 参数设置 设置QLabel的大小格式 QWidget* widget new QWidget; widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); widget->…

31-5 命令执行漏洞 - RCE漏洞利用

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、打开pikachu靶场 二、远程命令执行利用 正常情况下这一关卡就是个ping命令,我们只能输入个 ip 靶场就就会ping 这ip 但是我们可以用管道符拼接来执行其他命令,详细可以看我…

每日一题 --- 快乐数[力扣][Go]

快乐数 题目&#xff1a;202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

正弦实时数据库(SinRTDB)的使用(5)-历史数据查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…

Linux: 检测工具: monit: cpu占用率的一个例子

最近看到monit使用的CPU有时候会突然的增加,通过perf查看,可以看到是下面这个函数调用占用的比较高。 Overhead Comma Shared Object Symbol 29.72% monit [kernel.kallsyms] [k] __d_lookup__d_lookup29.65% d_lookup proc_fill_cache ` proc_readfd_common iterate_dir ksy…

(2024,嵌套标记化,区域编码器,上下文编码器,Transformer-XL,Mamba)xT:大图像中更大上下文的嵌套标记化

xT: Nested Tokenization for Larger Context in Large Images 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 背景 3.1. 长上下文模型作为上下文编码器 3.2. 线性注意机…

2024年妈妈杯数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

如何在 Oracle 中使用 CREATE SEQUENCE 语句

在本文中&#xff0c;我们将讨论 Oracle CREATE SEQUENCE 语句&#xff0c;其主要目的是提供一种可靠的方法来生成唯一且连续的数值&#xff0c;通常用于数据库表中的主键字段。此功能对于维护数据完整性和效率、确保不同记录之间的标识符有序分配尤其重要。从本质上讲&#xf…

数据库的横表和竖表

先来看个图: 定义如下&#xff1a; 横表&#xff1a;在一行数据中包含了所有的属性&#xff0c;一行就代表了一个完整的实体 竖表&#xff1a;在一行中只存储一个实体的一个属性&#xff0c;多个行组合在一起才组成一个完整的属性适用场景&#xff1a; 横表&#xff1a;对查…

从零玩转CanMV-K230(2)-开发环境搭建

文章目录 前言一、编译环境搭建二、镜像烧写总结 前言 本章介绍如何搭建CanMV-K230开发环境&#xff0c;基于LinuxRT-smart双系统开发 一、编译环境搭建 我是用的vmware虚拟机&#xff1a;ubuntu 20.04&#xff0c;搭建环境如下&#xff1a; 直接下载压缩包&#xff0c;下载…

【CTFshow 电子取证】套的签到题

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

一、JAVA集成海康SDK

JAVA集成海康SDK 文章目录 JAVA集成海康SDK前言一、项目依赖 jar1. examples.jar2. 项目依赖 jna.jar,可以通过 maven依赖到。二、集成SDK1.HcNetSdkUtil 海康 SDK封装类2.HCNetSDK3.Linux系统集成SDK三、总结前言 提示:首先去海康官网下载 https://open.hikvision.com/dow…

56、FreeRTOS/GPIO与定时器相关学习20240329

一、代码实现控制开发板上的指示灯闪烁。 /* USER CODE BEGIN 0 */ //利用定时器机制 定时器溢出时对应的回调函数实现如下 //本次实现控制PB0&#xff0c;PB1两个灯 int flag1 0,flag2 0;//使用一个标记执行以下代码 会造成一个灯常亮 另一个常灭 void HAL_TIM_PeriodElaps…

vue3+ts白屏问题解决

文章目录 打开白屏解决方法可能出现问题使用base导致的使用baseUrl导致的 注意点vue3ts白屏问题知识分享 打开白屏 解决方法 在vue.config.js页面 添加publicPath:./, const { defineConfig } require(vue/cli-service)module.exports defineConfig({ transpileDependenci…

Nginx-记

Nginx是一个高性能的web服务器和反向代理服务器&#xff0c;用于HTTP、HTTPS、SMTP、POP3和IMAP协议。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。 &#xff08;1&#xff09;更快 这表现在两个方面&#xff1a;一方面&#xff0c;在正常情况下&…

工业无线网关在汽车制造企业的应用效果和价值-天拓四方

随着智能制造的快速发展&#xff0c;工业无线网关作为关键通信设备&#xff0c;在提升生产效率、优化生产流程、实现设备间的互联互通等方面发挥着越来越重要的作用。以下是一个关于工业无线网关在智能制造行业应用的具体案例&#xff0c;展示了其在实际生产中的应用效果和价值…

Nomad Web更新没有最快只有更快

大家好&#xff0c;才是真的好。 很长时间没介绍运行在浏览器中的Notes客户端即Nomad Web更新情况。 不用安装&#xff0c;直接使用&#xff0c;还可以完美地兼容适应各种操作系统&#xff0c;Nomad Web一定是Notes/Domino产品现在和将来重点发展的用户访问模式。 不过&…

C语言例4-34:找出11~100所有不能被5整除的整数,要求在第n行输出10*n+1~10*(n+1)之间符合要求的数

代码如下&#xff1a; //找出11~100所有不能被5整除的整数&#xff0c;要求在第n行输出10*n1~10*(n1)之间符合要求的数 #include<stdio.h> int main(void) {int i;for(i11;i<100;i) //遍历11~100的所有整数{if(i%100){printf("\n");continue; /…