首页 > 编程语言 >C++U6-06 - 一维线性动态规划

C++U6-06 - 一维线性动态规划

时间:2024-03-04 21:12:08浏览次数:22  
标签:include 06 int U6 C++ 数组 ans 动态 dp

上节课作业:

链接:https://pan.baidu.com/s/17Fei1SuGEk5pnSspf_hprg?pwd=hq04
提取码:hq04

 

动态规划

 

 

[最长上升子序列]

 

 

本题采用动态规划 。
数据储存,设定数组a[]用于存储数字序列 ,设定dp[]数组用于统计上升的序列个数;
遍历组数a[],在遍历的过程中如果出现了数字上升的情况,就使用动态规划累计当前的最优解;
动态转移方程为 ,dp[i] = max(dp[i],dp[j]+1);
最后,遍历数组dp[] , 找出dp[]数组中的最大值。

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N], dp[N];
int n;
int ans;
int main(){
    cin >> n;
    for (int i=1; i<=n; i++) {
        cin >> a[i];
        dp[i] = 1;
        for (int j=1; j<i; j++) {
            if (a[j] < a[i]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
            ans = max(ans, dp[i]); 
        }
    }   
    cout << ans << endl;
    return 0;
}
View Code

[导弹拦截]

 

 

还是最长序的模型

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N], dp[N];
int n;
int ans;
int main(){
    cin >> n;
    for (int i=1; i<=n; i++) {
        cin >> a[i];
        dp[i] = 1;
        for (int j=1; j<i; j++) {
            if (a[j] >= a[i]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        ans = max(ans, dp[i]); 
    }   
    cout << ans << endl;
    return 0;
}
View Code

 

[编辑距离]

 

 

本题采用动态规划 。

数据储存,设定数组a[] 与数组 b[] ,用于存储AB字符串;

使用二维数组f,一维表示a字符串长度为i,二维表示b字符串长度为j;

因为增加一个字符相当于b字符串删掉一个字符,修改一个字符相当于不增也不减,相当于两个字符相等时的情况

初始化时当a为0位时,操作个数肯定是b的长度(即增加b长度个字符)

同理,当b为0位时,操作个数肯定是a的长度(即删除a长度个字符)

动态转移方程:

if(a[i] == b[j]) f[i][j] = f[i-1][j-1];

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

#include <iostream>
#include <cstring>
using namespace std;

const int N = 2020;
char a[N], b[N];
int al, bl;
int f[N][N];

int main() {

    cin >> a+1 >> b+1;
    al = strlen(a+1), bl = strlen(b+1);
    for (int i=1; i<=al; i++) f[i][0] = i;    // 代码设计技巧,对应一个空字符的修改次数
    for (int i=1; i<=bl; i++) f[0][i] = i;    // 代码设计技巧,对应一个空字符的修改次数
    for (int i=1; i<=al; i++) {
        for (int j=1; j<=bl; j++) {
            if (a[i] == b[j]) {
                f[i][j] = f[i-1][j-1];
            } else {
                f[i][j] = min(f[i-1][j-1], min(f[i-1][j], f[i][j-1]))+1;
            }
        }
    }
    cout << f[al][bl] << endl;

    return 0; 
}
View Code

 

 

作业:

链接:https://pan.baidu.com/s/1ASA3fair7LakNs5MEPrRQQ?pwd=jij9
提取码:jij9

 

标签:include,06,int,U6,C++,数组,ans,动态,dp
From: https://www.cnblogs.com/jayxuan/p/18052690

相关文章

  • C++ mySQL数据库连接池(windows平台)
    C++MySQL数据库连接池新手学了C++多线程,看了些资料练手写了C++数据库连接池小项目,自己的源码地址关键技术点MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产......
  • C++ 简易STL 教程 与 C++ 标准库
    C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++标准模板库的核心包括以下三个组件:组件描述容器(Containers)容器是用来管理某一类对象的集合。C++提供了各种不......
  • C++U5-第06课-广度优先搜索3
    温故知新广搜的概念,编程实现基本流程 二进制矩阵中的最短路径]    【题意分析】找到一个从(0,0)到达(n-1,n-1)的路径并且路径上每一个数字都为0【思路分析】首先如果grid[0][0]=1,那么显然不存在最短路径,因此输出-1。使用dist[x][y]保存左上角单......
  • 【C++】【OpenCV-4.9.0】灰度图取反(Mat属性的使用)
    此次我们将一张图像转灰度后再进行灰度取反,即黑的变白的,白的变黑的,所以我们需要获取每个像素点上的灰度级,cv中提供了一个函数at,但是这个函数还有11个重载函数,太多了,我们只用这次需要用到的,即通过读取像素点的位置来获取灰度级。◆ at() [3/12]template<typename_Tp>c......
  • 提高C++编译速度
    提高C++编译速度BuildPerformanceInsights-Crascit如何分析和提高大型项目(C/C++)的编译速度?-知乎(zhihu.com)以上链接提供了提高编译速度的方案,以及如何检查是编译哪个文件花的时间最长。实践下来,我采用的方案是直接换用ninja来替代make,结合CMake计时参数,成功将......
  • C++ 命名空间
    在C++应用程序中。例如,您可能会写一个名为xyz()的函数,在另一个可用的库中也存在一个相同的函数xyz()。这样,编译器就无法判断您所使用的是哪一个xyz()函数。因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。......
  • C++系列:const关键字
    前言在学习C++时,const关键字的知识点分散在书的各个章节。当我们尝试在编程时使用const时,总会感觉有一些细节被遗忘,因而不能得心应手地使用const关键字。因此,本篇文章尝试着对const关键字的做一些总结。参考书籍《C++PrimerPlus》const总结这里是我做的关于const关键字的一些......
  • P1064 [NOIP2006 提高组] 金明的预算方案
    原题链接题解遍历主件,和还剩下多少钱的情况下,最多有五种购买决策1.不买2.买主件3.买主件+附件14.买主件+附件25.买主件+附件1+附件2如果当前的钱够买,那就买买看,然后加上剩下的钱能买的最大值code#include<bits/stdc++.h>usingnamespacestd;structunit{intv,......
  • (持续更新)c++结构体
    结构体指针作用:通过指针访问结构体中的成员利用操作符->可以通过结构体指针访问结构体属性 1.指针访问单一结构体#include<iostream>#include<string>#include<ctime>usingnamespacestd;structStudent{stringname;intage;intscore;};i......
  • C++ 动态内存
    C++ 动态内存C++程序中的内存分为两个部分:栈:在函数内部声明的所有变量都将占用栈内存。堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。在C++中,您可......