备战蓝桥杯---动态规划(入门1)

news2025/1/19 8:25:32

先补充一下背包问题:

于是,我们把每一组当成一个物品,f[k][v]表示前k组花费v的最大值。

转移方程还是max(f[k-1][v],f[k-1][v-c[i]]+w[i])

伪代码(注意循环顺序):

for 所有组:

        for v=max.....0

                for i:f[v]=max(f[v],f[v-c[i]]+w[i])

下面看看区间dp的应用:

下面是分析:

我们令f[i][j]表示从ai到aj的串中,有多少个匹配的括号。

我们分析最左边的,1.它匹配:f[i][j]=max(f[i][k]+f[k+1][j]),对于最后一个,若可以匹配+2,不可以就不加。

2.他不匹配:f[i][j]=max(f[i+1][j]);

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
string s;
int f(int i,int j){
	if(i>=j) return dp[i][j]=0;
	if(dp[i][j]!=-1) return dp[i][j];
	for(int k=i+1;k<=j-1;k++){
		if((s[i]=='('&&s[k]==')')||(s[i]=='['&&s[k]==']')) dp[i][j]=max(dp[i][j],f(i+1,k-1)+f(k+1,j)+2);
		else dp[i][j]=max(dp[i][j],f(i+1,k-1)+f(k+1,j));
	}
	dp[i][j]=max(dp[i][j],f(i+1,j));
	if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')){
		dp[i][j]=max(dp[i][j],f(i+1,j-1)+2);
	}
	else dp[i][j]=max(dp[i][j],f(i+1,j-1));
	return dp[i][j];
}
int main(){
	while(cin>>s){
		if(s=="end") break;
		memset(dp,-1,sizeof(dp));
		cout<<f(0,s.size()-1)<<endl;
	}
}

接题:

法1,我们倒序求一串,相当于求他们的公共子序列。

法2.区间dp,f[i][j]表示ai,aj的最长回文子序列。

ai==aj f[i][j]=f[i+1][j-1]+2;

否则,f[i][j]=max(f[i+1][j],f[i][j-1])

下面是AC代码:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int a[1050][1050];
        int n=s.length();
        for(int j=0;j<=n-1;j++){
            a[j][j]=1;
        }
        for(int j=1;j<=n-1;j++){
            for(int i=j-1;i>=0;i--){
                if(s[i]==s[j]) a[i][j]=a[i+1][j-1]+2;
                else a[i][j]=max(a[i+1][j],a[i][j-1]);
            }
        }
       return a[0][n-1];
    }
};

我们再思考一下:如果是要求连续的?

我们用bool数组f[i][j]表示i---j是否为回文

转移方程:if a[i]==a[j]&&f[i+1][j-1]==1回文,反之不回文

下面看一个具体应用:

我们先不考虑它成环,我们令dp[i][j]为i---j的合并的max,那么我们枚举最后一次合并的分界+i---j的和即可,转移方程为dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])

我们再考虑成环,其实只是断开点的不同,换句话说,1234的情况变成了1234,2341,3412,4123,我们只要取max即可,为方便同时利用上一次的记入,我们直接for12341234即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,dp[402][402],dp1[402][402],a[402],sum[402];
int f(int i,int j){
    if(i==j) return dp[i][j]=0;
    if(dp[i][j]!=-1) return dp[i][j];
    for(int k=i;k<=j-1;k++){
        dp[i][j]=max(dp[i][j],f(i,k)+f(k+1,j)+sum[j]-sum[i-1]);
    }
    return dp[i][j];
}
int f1(int i,int j){
    if(i==j) return dp1[i][j]=0;
    if(dp1[i][j]!=-1) return dp1[i][j];
    dp1[i][j]=f(i+1,j)+sum[j]-sum[i-1];
    for(int k=i;k<=j-1;k++){
        dp1[i][j]=min(dp1[i][j],f1(i,k)+f1(k+1,j)+sum[j]-sum[i-1]);
    }
    return dp1[i][j];
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
    for(int i=n+1;i<=2*n;i++){
        a[i]=a[i-n];
        sum[i]=sum[i-1]+a[i];
    }
    memset(dp,-1,sizeof(dp));
    memset(dp1,-1,sizeof(dp1));
    int ans1=0,ans2=f1(1,n);
    for(int i=1;i<=n;i++){
        ans2=min(ans2,f1(i,i+n-1));
    }
    cout<<ans2<<endl;
    for(int i=1;i<=n;i++){
        ans1=max(ans1,f(i,i+n-1));
    }
    cout<<ans1<<endl;
}

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

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

相关文章

wayland(xdg_wm_base) + egl + opengles 纹理贴图进阶实例(四)

文章目录 前言一、使用gstreamer 获取 pattern 图片二、代码实例1. pattern 图片作为纹理数据源的代码实例1.1 基于opengles2.0 接口的 egl_wayland_texture2_1.c1.2 基于opengles3.0 接口的 egl_wayland_texture3_1.c2. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c3…

算法学习——LeetCode力扣二叉树篇8

算法学习——LeetCode力扣二叉树篇8 669. 修剪二叉搜索树 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high…

Day 44 | 动态规划 完全背包、518. 零钱兑换 II 、 377. 组合总和 Ⅳ

完全背包 题目 文章讲解 视频讲解 完全背包和0-1背包的区别在于&#xff1a;物品是否可以重复使用 思路&#xff1a;对于完全背包问题&#xff0c;内层循环的遍历方式应该是从weight[i]开始一直遍历到V&#xff0c;而不是从V到weight[i]。这样可以确保每种物品可以被选择多次…

解决Thymeleaf的地震震中距离展示[[]]双引号报错的问题

目录 前言 一、问题场景还原 1、需求场景 2、系统设计 3、功能实现 4、线数据标注展示 5、页面出错 二、解决Thymeleaf报错 1、错误说明 2、参数改造 3、问题修复 总结 前言 今天是2024年2月12日&#xff0c;农历正月初三&#xff0c;还是农历龙年春节。在这里首先…

ubuntu快速安装miniconda

ubuntu快速安装miniconda 环境 ubuntu.22.04 显卡 RTX 3050 关于选择Miniconda还是Anaconda的问题&#xff0c;Anaconda安装包比较大&#xff0c;耗时比较长&#xff0c;如果你是绝对的初学者&#xff0c;选择Anaconda会比较稳妥一些&#xff1b;否则建议你还是选择Miniconda安…

docker 1:介绍

docker 1&#xff1a;介绍 docker解决哪些问题&#xff1a; 传统APP在安装到不同电脑的时候可能会遇到依赖问题&#xff0c;比如缺少VS 20xx&#xff0c;软件无法运行”的情况。docker使用容器技术将软件 依赖​打包为image包发布&#xff0c;解决了依赖问题。docker有一个官…

考研高数(导数的定义)

总结&#xff1a; 导数的本质就是极限。 函数在某点可导就必连续&#xff0c;连续就有极限且等于该点的函数值。 例题1&#xff1a;&#xff08;归结原则的条件是函数可导&#xff09; 例题2&#xff1a; 例题3&#xff1a;

Unity下使用Sqlite

sqlite和access类似是文件形式的数据库&#xff0c;不需要安装任何服务&#xff0c;可以存储数据&#xff0c;使用起来还是挺方便的。 首先需要安装DLL 需要的DLL 我们找到下面两个文件放入Plugins目录 Mono.Data.Sqlite.dll System.Data.dll DLL文件位于Unity的安装目录下的…

controller-manager学习三部曲之三:deployment的controller启动分析

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 《controller-manager学习三部曲》完整链接 通过脚本文件寻找程序入口源码学习deployment的controller启动分析 本篇概览 本文是《controller-manager学习三…

部署JForum2过程。

居然用了两天时间&#xff0c;才把JForum2部署成功。走了一些弯路&#xff0c;主要原因是想当然&#xff0c;以为jdk和tomcat&#xff0c;应该向下兼容&#xff0c;所以就随便选的版本。 一、jdk-17、apache-tomcat-10.1.18-windows-x64&#xff0c;部署完jforum-2.8.2.war,改…

基于STM32与FreeRTOS的四轴机械臂项目

目录 一、项目介绍 二、前期准备 1.硬件准备 2.开发环境 3.CubeMX配置 三、裸机各种模块测试 1.舵机模块 2.蓝牙模块 3.按键摇杆传感器模块和旋钮电位器模块 4.OLED模块 5.W25Q128模块 四、裸机三种控制测试 1.摇杆控制 2.示教器控制 3.蓝牙控制 五、裸机与Free…

linux应用 进程间通信之共享内存(POSIX)

1、前言 1.1 定义 POSIX共享内存是一种在UNIX和类UNIX系统上可用的进程间通信机制。它允许多个进程共享同一块内存区域&#xff0c;从而可以在这块共享内存上进行读写操作。 1.2 应用场景 POSIX共享内存适用于需要高效地进行大量数据交换的场景&#xff0c;比如多个进程需要…

Hive的Join连接

前言 Hive-3.1.2版本支持6种join语法。分别是&#xff1a;inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左…

C++ bfs再探迷宫游戏(五十五)【第二篇】

今天我们用bfs解决迷宫游戏。 1.再探迷宫游戏 前面我们已经接触过了迷宫游戏&#xff0c;并且学会了如何使用 DFS 来解决迷宫最短路问题。用 DFS 求解迷宫最短路有一个很大的缺点&#xff0c;需要枚举所有可能的路径&#xff0c;读入的地图一旦很大&#xff0c;可能的搜索方案…

VM和Linux安装

VM和Linux安装 一、下载VM 1.官网地址&#xff1a;https://www.vmware.com/cn.html 2.其他地址&#xff1a;http://ww7.nocmd.com/windows/740.html 许可证这个&#xff0c;大家可以自己上网搜索&#xff0c;很容易就搜索到就可以使用了 上面内容就是安装VM的步骤 安…

BFS与DFS初级练习(排列数字,n-皇后,走迷宫)

BFS与DFS初步了解 DFS&#xff08;深度优先搜索&#xff09;和BFS&#xff08;广度优先搜索&#xff09;是两种常用的图遍历算法。 DFS是一种递归的搜索算法&#xff0c;它从起始节点开始&#xff0c;沿着路径依次访问与当前节点相邻的未访问节点&#xff0c;直到无法继续访问…

Pytorch的可视化

1 使用 wandb进行可视化训练过程 本文章将从wandb的安装、wandb的使用、demo的演示进行讲解。 1.1 如何安装wandb&#xff1f; wandb的安装比较简单&#xff0c;在终端中执行如下的命令即可&#xff1a; pip install wandb在安装完成之后&#xff0c;我们需要&#xff0c;去…

【力扣】5.最长回文子串

这道题我主要是通过动态规划来进行解题&#xff0c;看了我好久&#xff08;解析&#xff09;&#xff0c;生疏了呀。 首先就是判断一个字符串是不是回文&#xff0c;我们可以设置两个指针&#xff0c;从前往后进行判断即可&#xff0c;运用暴力解题法&#xff0c;这里运用的动…

【C++】内存详解(堆,栈,静态区)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【FPGA】VHDL:八段码到8421BCD码转换电路

目录 EDA设计基础练习题 &#xff1a; 实验要求如下&#xff1a; 代码 八段码到8421BCD码转换电路 8421BCD码到八段码转换电路 八段码到8421BCD~运行结果展示 8421BCD转八段码~运行结果展示 特别注意 软件&#xff1a;Quartus II 13.0 (64-bit) 语言&#xff1a;VHDL E…