动态规划:区间dp

让字符串成为回文串的最少插入次数

暴力递归

int f1(string s, int l, int r) {
	if (l == r)
		return 0;
	if (l + 1 == r)
		return s[l] == s[r] ? 0 : 1;
	if (s[l] == s[r])
		return f1(s, l + 1, r - 1);
	else
		return min(f1(s, l, r - 1), f1(s, l + 1, r)) + 1;
}

记忆化搜索

const int N=5555;

class Solution {
public:
    int dp[N][N];
    int f1(string s, int l, int r) {
	int ans;
    if(dp[l][r]!=-1)
        return dp[l][r];
	if (l == r)
		ans=0;
	else if (l + 1 == r)
	    ans= (s[l] == s[r] ? 0 : 1;
	else if (s[l] == s[r])
		ans= f1(s, l + 1, r - 1);
	else
		ans= min(f1(s, l, r - 1), f1(s, l + 1, r)) + 1;
    dp[l][r]=ans;
    return ans;    
}
    int minInsertions(string s) {
        int n=s.size();
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                dp[i][j]=-1;
            }
        }
        return f1(s,0,n-1);
    }

};

动态规划

预测赢家

力扣486

暴力递归

bool predictTheWinner(vector<int>& nums) {
	int sum = 0;
	for (int num : nums) {
		sum += num;
	}
	int n = nums.size();
	int first = f1(nums, 0, n - 1);
	int second = sum - first;
	return first >= second;
}

int f1(vector<int>nums, int l, int r) {
	if (l == r)
		return nums[l];
	if (l == r - 1)
		return max(nums[l], nums[r]);
	//1.玩家1拿走nums[l] l+1,r
	int p1 = nums[l] + min(f1(nums, l + 2, r), f1(nums, l + 1, r - 1));
	//2.玩家1拿走nums[r] l,r-1
	int p2 = nums[r] + min(f1(nums, l + 1, r - 1), f1(nums,l,r-2));
	return max(p1, p2);
}

记忆化搜索

const int N=50;
class Solution {
public:
    int dp[N][N];

    bool predictTheWinner(vector<int>& nums) {
       int sum=0;
       for(int num:nums){
           sum+=num;
       }
			 int n=nums.size();
       for(int i=0;i<n;i++){
				 for(int j=0;j<n;j++){
					 dp[i][j]=-1;
				 }
			 }
       int first=f2(nums,  0,  n-1);
       int second=sum-first;
       return first>=second;
    }
    int f2(vector<int>nums, int l, int r) {
	if (dp[l][r] != -1)
		return dp[l][r];
	int ans;
	if (l == r)
		ans= nums[l];
	else if (l == r - 1)
		ans= max(nums[l], nums[r]);
	else {
		//1.玩家1拿走nums[l] l+1,r
		int p1 = nums[l] + min(f2(nums, l + 2, r), f2(nums, l + 1, r - 1));
		//2.玩家1拿走nums[r] l,r-1
		int p2 = nums[r] + min(f2(nums, l + 1, r - 1), f2(nums, l, r - 2));
		ans = max(p1, p2);
	}
	dp[l][r] = ans;
	return ans;
  }
};



括号配对

牛客:括号区间配对

如何转移:

记忆化搜索

#include <iostream>
#include<string>
#include <cstring>
#include <climits>
#include <cmath>
#include <vector>
using namespace std;
const int N=222;
int dp[N][N];

int f(string s,int l,int r){
    if(l==r)
        return 1;
    if(l==r-1){
        if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))
            return 0;
       
         return 2;
    }
    if(dp[l][r]!=-1)
        return dp[l][r];
    
    int p1=INT_MAX;
    //可能性1: L R本来配对
    if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))
        p1=f(s,l+1,r-1);
    int p2=INT_MAX;
    //可能性2:基于每个可能的划分点做划分
    for(int m=l;m<r;m++){
        p2=min(p2,f(s,l,m)+f(s,m+1,r));
    }
    int ans=min(p1,p2);
    dp[l][r]=ans;
    return ans;
}

int main() {
    string s;
    cin>>s;
    int n=s.size();
    memset(dp,-1,sizeof(dp));
    cout<<f(s,0,n-1)<<endl;

}

涂色

转移与依赖

力扣:奇怪的打印机

const int N=222;

class Solution {
public:
    int dp[N][N];

    int strangePrinter(string s) {
        int n=s.size();
        dp[n-1][n-1]=1;
        for(int i=0;i<n-1;i++){
            dp[i][i]=1;
            dp[i][i+1]=s[i]==s[i+1]?1:2;
        }

        for(int l=n-3;l>=0;l--){
            for(int r=l+2;r<n;r++){
                if(s[l]==s[r])
                   dp[l][r]=dp[l][r-1];
                else{
                    int ans=INT_MAX;
                    for(int m=l;m<r;m++){
                        ans=min(ans,dp[l][m]+dp[m+1][r]);
                    dp[l][r]=ans;
                }
              }
            }
        }
        return dp[0][n-1];
    }
};

 洛谷:涂色

合唱队

洛谷

#include <iostream>
#include<string>
#include <cstring>
#include <climits>
#include <cmath>
#include <vector>
using namespace std;
const int N=1111;
int dp[N][N][2];
const int mod = 19650827;
int nums[N];

int main() {
   int n;
   cin>>n;
   for(int i=1;i<=n;i++){
     cin>>nums[i];
   }
    for(int i=1;i<n;i++){
        if(nums[i]<nums[i+1]){
            dp[i][i+1][0]=1;
            dp[i][i+1][1]=1;
        }
    }
    for(int l=n-1;l>=1;l--){
        for(int r=l+2;r<=n;r++){
            if(nums[l]<nums[l+1])
                dp[l][r][0]=(dp[l][r][0]+dp[l+1][r][0])%mod;
            if(nums[l]<nums[r])
                dp[l][r][0]=(dp[l][r][0]+dp[l+1][r][1])%mod;
            if(nums[r]>nums[l])
                dp[l][r][1]=(dp[l][r][1]+dp[l][r-1][0])%mod;
            if(nums[r]>nums[r-1])
                dp[l][r][1]=(dp[l][r][1]+dp[l][r-1][1])%mod;
        }
    }
    cout<<(dp[1][n][0]+dp[1][n][1])%mod;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql 链接超时的几个参数详解

mysql5.7版本中&#xff0c;先查看超时设置参数&#xff0c;我们这里只关注需要的超时参数&#xff0c;并不是全都讲解 show variables like %timeout%; connect_timeout 指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒&#xff0c;之前版本默认是5秒&#xff0c;主…

洛谷 P8794 [蓝桥杯 2022 国 A] 环境治理

文章目录 [蓝桥杯 2022 国 A] 环境治理题目链接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路解析CODE给点思考 [蓝桥杯 2022 国 A] 环境治理 题目链接 https://www.luogu.com.cn/problem/P8794 题目描述 LQ 国拥有 n n n 个城市&#xff0c;从 0 0 …

【开源】基于JAVA的木马文件检测系统

项目编号&#xff1a; S 041 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S041&#xff0c;文末获取源码。} 项目编号&#xff1a;S041&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…

利用python将data:image/jpg; base64,格式数据转化下载为图片

在做爬虫爬取图片时&#xff0c;发现有的图片url是用“data:image/jpg;base64” 开头的&#xff0c;例如下图 部分开头样式如下&#xff1a; 1、data:image/jpg; base64, 2、data:image/png; base64, 3、data:image/webp;base64, 利用python进行代码进行图片下载&#xff0c;…

JDK多版本集成 Jacoco 配置指南

JDK多版本集成 Jacoco 配置指南 本篇相关 JDK 版本配置如下&#xff1a; JDK8 JDK11 JDK17 Jacoco 是什么 Jacoco 是一个用于Java程序的代码覆盖率报告工具。它通过动态分析&#xff08;在代码执行时收集数据&#xff09;来生成代码覆盖率报告文件。Jacoco 支持多种覆盖率标…

Docker | 自定义网络

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容: Docker | 自定义网络 📚个人知识库: 知识库,欢迎大家访问 1.前言 大家好,我是Leo哥…

【K8s】Kubernetes CRD 介绍(控制器)

文章目录 CRD 概述1. 操作CRD1.1 创建 CRD1.2 操作 CRD 2. 其他笔记2.1 Kubectl 发现机制2.2 校验 CR2.3 简称和属性 3. 架构设计3.1 控制器概览 参考 CRD 概述 CR&#xff08;Custom Resource&#xff09;其实就是在 Kubernetes 中定义一个自己的资源类型&#xff0c;是一个具…

three.js 入门三:buffergeometry贴图属性(position、index和uvs)

环境&#xff1a; three.js 0.159.0 一、基础知识 geometry&#xff1a;决定物体的几何形状、轮廓&#xff1b;material&#xff1a;决定物体呈现的色彩、光影特性、贴图皮肤&#xff1b;mesh&#xff1a;场景中的物体&#xff0c;由geometry和materia组成&#xff1b;textu…

【MySQL系列】Centos安装MySQL

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

电镀污水处理设备有哪些

电镀污水处理设备是用来处理电镀过程中产生的废水&#xff0c;并将废水中的有害物质去除&#xff0c;使其达到排放标准的设备。通常&#xff0c;电镀污水处理设备包括以下几种类型&#xff1a; 1. 预处理设备&#xff1a;预处理设备通常包括过滤器、物理方法和化学方法等。过滤…

智能优化算法应用:基于混合蛙跳算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混合蛙跳算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混合蛙跳算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混合蛙跳算法4.实验参数设定5.算法结果6.…

Android集成科大讯飞语音识别与语音唤醒简易封装

目录 一、语音唤醒部分 1、首先在科大讯飞官网注册开发者账号 2、配置唤醒词然后下载sdk 3、选择对应功能下载 4、语音唤醒lib包全部复制到工程目录下 5、把语音唤醒词文件复制到工程的assets目录 6、复制对应权限到AndroidManifest.xml中 7、唤醒工具类封装 二、语音识…

Java第二十一章

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

node.js express cors解决跨域

目录 什么是跨域 示例 postman请求 前端请求 cors中间件解决跨域 流程 配置cors参数 什么是跨域 跨域&#xff08;Cross-Origin&#xff09;是指在 Web 开发中&#xff0c;当一个网页的源&#xff08;Origin&#xff09;与另一个网页的源不同时&#xff0c;就发生了跨域…

【USRP】LFTX / LFRX

LFTX/LFRX 设备概述 LFTX 子板利用两个高速运算放大器来允许 0-30 MHz 的传输。该板仅接受实模式信号。LFTX 非常适合 HF 频段的应用&#xff0c;或使用外部前端来上变频和放大中间信号的应用。LFTX 的输出可以独立处理&#xff0c;也可以作为单个 I/Q 对进行处理。 主要特征…

Mac 如何删除文件及文件夹?可以尝试使用终端进行删除

MacOS 是 Mac 电脑采用的操作系统&#xff0c;你知道 Mac 如何删除文件吗&#xff1f;除了直接将文件或者文件夹拖入废纸篓之外&#xff0c;我们还可以采用终端命令的办法去删除文件&#xff0c;本文为大家总结了 Mac 删除文件方法。 为何使用命令行删除文件 在使用 Mac 电脑…

无人零售柜:快捷舒适购物体验

无人零售柜&#xff1a;快捷舒适购物体验 通过无人零售柜和人工智能技术&#xff0c;消费者在购物过程中可以自由选择商品&#xff0c;根据个人需求和喜好查询商品清单。这种自主选择的购物环境能够为消费者提供更加舒适和满意的体验。此外&#xff0c;无人零售柜还具有节约时间…

字符统计[c]

#include<stdio.h> #include<string.h> int main() {int a,b,c;abc0;char s[100];int i0;while(1){i;scanf("%c",&s[i]);if(s[i]?)break;}for(int k1;k<i;k){if(s[k]>48&&s[k]<57){a;//数字}else if((s[k]>65&&s[k]<…

我的 CSDN 三周年创作纪念日:2020-12-12

本人大叔一枚&#xff0c;自1992年接触电脑&#xff0c;持续了30年的业余电脑发烧爱好者&#xff0c;2022年CSDN博客之星Top58&#xff0c;阿里云社区“乘风者计划”专家博主。自某不知名财校毕业后进入国有大行工作至今&#xff0c;先后任职于某分行信息科技部、电子银行部、金…

12月11日作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…