首页 > 其他分享 >动态规划(2)

动态规划(2)

时间:2023-05-07 11:33:21浏览次数:24  
标签:main 动态 const int namespace using include 规划

线性DP

数字三角形

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

 

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3e3+10, INF = 1e9  ; 
int n ; 
int a[N][N] ; 
int f[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=1; 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] ) ; // 遍历底部节点,选出最大的 
                             
    cout<<res<<endl ;     
    return 0;
}     

最长上升子序列

给定一个长度为N 的数列,求数值严格单调递增的子序列的长度最长是多少。

 

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3e3+10 ; 
int n ; 
int a[N]; 
int f[N] ; 
 
int main(){        
    cin>>n ; 
    for(int i=1; i<=n; i++) cin>>a[i] ; 
    
    for(int i=1; i<=n; i++)
    {
        f[i] = 1; // 只有a[i]一个数 
        for(int j=1; j<i; j++ )
            if(a[j]<a[i])
                f[i] = max(f[i], f[j]+1) ; 
    }
    
    int res = 0 ;
    for(int i=1; i<=n; i++) // 找最大的
        res = max(res, f[i]) ;
             
    cout<<res<<endl ;     
    return 0;
}     

最长公共子序列

 

#include <iostream>
#include <algorithm>
using namespace std ;
const int N = 1010 ; 
int n,m ; 
char a[N], b[N]; 
int f[N][N] ;

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

最短编辑距离

 

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

const int N = 1010 ; 

int n,m ; 
char a[N], b[N]; 
int f[N][N] ;

int main(){
    
    scanf("%d%s%d%s",&n, a+1,&m, b+1 ) ; 
    for(int i=0; i<=m ; i++) f[0][i] = i; //a为空,肯定是添加
    for(int j=0; j<=n ; j++) f[j][0] = j ;//b为空,肯定是删除
    
    for(int i=1; i<=n ;i++)
    {
        for(int j=1 ; j<=m ; j++)
        {
            f[i][j] = min(f[i-1][j]+1, f[i][j-1]+1) ; 
            if(a[i]==b[j]) f[i][j] = min(f[i][j], f[i-1][j-1]) ;
            else f[i][j] = min(f[i][j], f[i-1][j-1]+1) ; 
        }
    }
    cout<<f[n][m] ; 
    return 0 ;
}

区间DP

 

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

const int N = 1010 ; 

int n; 
int s[N] ; // 前缀和
int f[N][N] ;

int main(){
    
    cin>>n;  
    
    for(int i=1; i<=n; i++) cin>>s[i] ;
    
    for(int i=1; i<=n; i++) s[i] += s[i-1] ;
    
    for(int len = 2; len<=n; len++)
    {
        for(int i=1; i+len-1 <= n; i++)
        {
            int l=i, r = i+len-1 ; 
            f[l][r] = 8e7 ; // 先初始化为一个较大
            for(int k=l ; k<r; k++)
                f[l][r] = min( f[l][r], f[l][k] + f[k+1][r] + s[r] - s[l-1]) ;
        }
    }

    cout<<f[1][n] ;  // 从第1堆到第n堆合并的最小代价
    
    return 0 ;
}

 

标签:main,动态,const,int,namespace,using,include,规划
From: https://www.cnblogs.com/zundicai/p/17366295.html

相关文章

  • 动态分库分表策略
    关键字:动态分库分表策略参考网址:http://dragonsoar.iteye.com/blog/1769101其他相关软件:matrixOceanus(不支持spring)matrix没开源所以很多人还是用mycatdiamond里面可以配置读写比读写比权重那个是atom和group的作用吧国美好牛,以前后台ora......
  • Android开发:使用Glide动态加载圆形图片和圆角图片
    最新消息,鼎鼎大名的Yelp应用也转投Glide的阵营了,而且Glide在跟Listview的配合起来非常的顺畅,Glide除了配置简单,还可以本地缓存图片,也可以实现Listview图片的提前预加载,使得listview的更加的顺滑,具体可以查看Yelp的那篇博文。但是如果碰到要把加载下来的图片转成圆角或者圆形的图......
  • 浅谈C#中动态类型与值类型装拆箱问题
    C#中的值类型封箱、开箱与动态类型的关系封箱和开箱是C#中两个重要的概念,它们涉及到值类型和引用类型在编译七和运行时的处理方式。动态类型是C#4.0引入的一个新特性,它允许在编译时不指定类型,而在运行时动态绑定类型。本文将简要介绍封箱、开箱和动态类型的概念,以及装拆箱与动态......
  • 实现财富自由的初步规划方案
    先贴一张chatgpt给我的答案:下面的具体的可执行计划:1、提高工作岗位的技能掌握大前端技术栈,掌握iOS和前端技能2、寻找高薪工作学习人工智能的相关知识,并输出文章,争取早日转行到AI行业3、投资技能学习学习相关知识,并逐步实践4、副业每月落地一个新项目5、控制开支与储......
  • JS动态时间
    一、动态时间动态走动<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"con......
  • 动态规划:剑指 Offer 10- I. 斐波那契数列
    题目描述: 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0)=0,F(1)=1F(N)=F(N-1)+F(N-2),其中N>1.斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模1e9+7(10000......
  • Oracle 动态数组使用-2
    动态数组语法:type<类型名>istableof类型indexbybinary_integer;<变量名>类型名示例:declaretypejo_arr_typeistableofpljson;--jo_arr_type为表(数组)类型jo_arrjo_arr_type;--jo_arr为数组类型变量名typecur_ref_typeisrefcursor;--声明......
  • 基础动态规划
    P1880[NOI1995]石子合并题解区间DP。首先将其复制一遍(因为是环)。设\(f[i][j]\)表示将\(i\)到\(j\)段的石子合并需要的次数。有\[f[i][j]=0(i=j)\]\[f[i][j]=min(max)\{f[i][k]+f[k+1][j]+\sum_{k=i}^{j}a[k](i\leqk<j)\}\]#include<iostream>......
  • js数据结构变化 table动态列展示
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=......
  • java基础-数组的定义,静动态初始化,数组元素的相关操作、数组的内存图
    一、什么是数组数组指的是一种容器,可以用来存储同种数据类型的多个值。数组容器在存储数据的时候,需要结合隐式转换考虑。例如:int类型的数组容器,只能存储byte、short、int类型的数据。(byte<short<int<long<float<double)例如:double类型的数组容器,可以存储byte、short、int、long......