首页 > 其他分享 >动态规划——线性dp

动态规划——线性dp

时间:2024-03-25 17:59:05浏览次数:22  
标签:main const int namespace cin 线性 using 动态 dp

数字三角形

// 从上到下
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 510, INF = 1e9;
int n;
int a[N][N];
int f[N][N];

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= i; j ++ )
            scanf("%d", &a[i][j]);

    for (int i = 0; i <= n; i ++ )
        for (int j = 0; j <= i + 1; j ++ )
            f[i][j] = -INF;

    f[1][1] = a[1][1];
    for (int i = 2; i <= n; i ++ )
        for (int j = 1; j <= i; j ++ )
            f[i][j] = max(f[i - 1][j - 1] + a[i][j], f[i - 1][j] + a[i][j]);

    int res = -INF;
    for (int i = 1; i <= n; i ++ ) res = max(res, f[n][i]);

    printf("%d\n", res);
    return 0;
}

// 从下到上
#include<iostream>
using namespace std;
const int N = 510;
int n, a[N][N];

int main(){
    cin>>n;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= i; j++){
            cin>>a[i][j];
        }
    }
    for(int i = n - 1; i > 0; i--){
        for(int j = 1; j <= i; j++){
            a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]);
        }
    }
    cout<<a[1][1];
    return 0;
}

最长上升子序列

#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], f[N];
int n, res;

int main(){
    cin>>n;
    for(int i = 1; i <= n; i++) cin>>a[i];
    for(int i = 1; i <= n; i++){ 
        f[i] = 1;
        for(int j = 1; j < i; j++){
            if(a[i] > a[j]) f[i] = max(f[i], f[j] + 1);
        }
        if(f[i] > res) res = f[i];
    }
    cout<<res;
    return 0;
}

// 求这个序列
#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], f[N];
int g[N], b[N];
int n;

int main(){
    cin>>n;
    for(int i = 1; i <= n; i++) cin>>a[i];
    int k = 1;
    for(int i = 1; i <= n; i++){ 
        f[i] = 1;
        for(int j = 1; j < i; j++){
            if(a[i] > a[j]){
                if(f[i] < f[j] + 1){
                    f[i] = f[j] + 1;
                    g[i] = j;
                }
            }
        }
        if(f[i] > f[k]) k = i;
    }
    cout<<f[k]<<endl;
    int cnt1 = f[k], cnt2 = f[k];
    for(int i = 0, len = f[k]; i < len; i++){
        b[cnt1--] = a[k];
        k = g[k];
    }
    //for(int i = 1; i <= cnt2; i++) cout<<b[i]<<" ";
    return 0;
}

最长上升子序列 II

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n;

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    int len = 0;
    for(int i = 1; i <= n; i++){
        int l = 0, r = len + 1;
        while(l + 1 < r){
            int mid = (l + r) / 2;
            if(b[mid] < a[i]) l = mid;
            else r = mid;
        }
        len = max(len, r);
        // b[l] 是小于 a[i] 的最后一个数
        b[r] = a[i];
    }
    printf("%d", len);
    return 0;
}

最长公共子序列

在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int f[N][N];
int n, m;
string a, b;

int main(){
    cin>>n>>m>>a>>b;
    int res = 0;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(a[i - 1] == b[j - 1]) f[i][j] = f[i - 1][j - 1] + 1;
            else{
                f[i][j] = max(f[i - 1][j], f[i][j - 1]);
            }
            res = max(res, f[i][j]);
        }
    }
    cout<<res;
    return 0;
}

最短编辑距离

#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int f[N][N];
int n, m;
string a, b;

int main(){
    cin>>n>>a>>m>>b;
    for(int i = 0; i <= n; i++) f[i][0] = i;
    for(int j = 0; j <= m; j++) f[0][j] = j;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(a[i - 1] == b[j - 1]) 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[n][m];
    return 0;
}

编辑距离

#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int f[15][15];
int n, m;
string s[N];

int main(){
    cin>>n>>m;
    for(int i = 0; i < n; i++) cin>>s[i];
    string a;
    int x;
    while(m--){
        cin>>a>>x;
        int cnt = 0;
        for(int k = 0; k < n; k++){
            int x1 = a.size(), x2 = s[k].size();
            for(int i = 0; i <= x1; i++) f[i][0] = i;
            for(int j = 0; j <= x2; j++) f[0][j] = j;
            for(int i = 1; i <= x1; i++){
                for(int j = 1; j <= x2; j++){
                    if(a[i - 1] == s[k][j - 1]) 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;
                    }
                }
            }
            if(f[x1][x2] <= x) cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

标签:main,const,int,namespace,cin,线性,using,动态,dp
From: https://blog.csdn.net/qq_62734493/article/details/137000068

相关文章

  • 使用dpkg在ubuntu上安装软件包遇到依赖包的问题
    问题在ubuntu上使用apt-get安装软件包,系统会自动安装依赖的软件包,但是使用dpkg在ubuntu上安装软件包时不会,有时会遇到下面的错误:pengdl@pengdl-HP:~/Soft$sudodpkg-ivirtualbox-7.0_7.0.14-161095~Ubuntu~focal_amd64.deb[sudo]passwordforpengdl:Selectingpreviously......
  • 【机器学习】深入解析线性回归模型
    【机器学习】深入解析线性回归模型引入一初步了解1.1概念1.2类比二基本要素2.1数据2.2模型方程2.3损失函数2类比2.4线性回归中的损失函数2.5优化算法三寻找最佳参数3.1初始化参数:3.2定义损失函数:3.3选择优化算法:3.4迭代优化过程:3.5检查收敛性和过拟合......
  • 动态尺寸加载libpag文件白边问题解决方案
    加载pag文件时,最理想的情况是canvas的宽高和pag资源文件的宽高一致,或比例一致。否则就会出现四周白边(页面底色),除非是按平铺的样式进行设置(源码暂未找到对应方法)。而对于页面宽高不定的情况下,就无法保证pag文件能适配页面,如果pag文件底色和父级页面底色不一致,就会表现出来......
  • 普通的动态加载库 和 显式运行时链接
    静态库:静态库在编译时被链接到你的程序中,因此它们会成为你程序的一部分。这意味着当你运行你的程序时,静态库中的代码已经被包含在你的程序中,因此你的程序可以独立运行,不需要依赖外部库文件。静态库的一个缺点是,它会增加你程序的体积,因为静态库中的代码会被完整地复制到你的......
  • 机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
    目录前言一、什么是线性回归二、什么是逻辑回归三、基于Python和Scikit-learn库实现线性回归示例代码: 使用线性回归来预测房价:四、基于Python和Scikit-learn库实现逻辑回归五、总结 线性回归的优缺点总结:逻辑回归(LogisticRegression)是一种常用的分类算法,......
  • 换根DP学习笔记
    啊啊啊啊啊啊啊啊啊啊啊啊画图累死我了额,这不菜根快乐DP(根)吗换根DP,即换根树形DP平常树形DP指定一个根,但万一邪恶出题人让你求多个点为根的情况呢?你们可能会想:多跑几遍不就好了!不可以的,直接TLE。这有个树,B是A之后的树根(拎上去):B成为树根后:画风突然转变但是!其实有些没变!......
  • 动态规划的工作原理,实现方式,应用场景
    动态规划(DynamicProgramming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。工作原理:动态规划的工作原理基于两个核心概念:重叠子问题:在求解问题......
  • 数据结构算法系列----对动态规划的感悟
    简介:   最近我一直在做和复习动态规划的题目,对动态规划有了一些新的理解和感悟。本文就是基于最近做的一些题目写的。一、动态规划的题目形式和选择   当题目是对于求某一串数字或者字符的最值时,一般就回想到三种解法,dfs暴搜、动态规划、贪心。在这三个之中显......
  • 从静态到动态化,Python数据可视化中的Matplotlib和Seaborn
    本文分享自华为云社区《Python数据可视化大揭秘:Matplotlib和Seaborn高效应用指南》,作者:柠檬味拥抱。安装Matplotlib和Seaborn首先,确保你已经安装了Matplotlib和Seaborn库。如果没有安装,可以使用以下命令进行安装:pipinstallmatplotlibseabornMatplotlib基础Matplotlib是......
  • 【DP】01背包问题与完全背包问题
    一、01背包问题有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包......