动态规划。第十三次

这篇具有很好参考价值的文章主要介绍了动态规划。第十三次。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2024.2.28

**************************************************************************************************************

题目链接:P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动态规划。第十三次,动态规划,算法

 思路:用dfs其实也可以写,不过这道题目会超时。由于题目上说只能往右边还有下面走,所以每一点的条数是其左边的条数加上右边的条数,关系式为f(x,y)=f(x-1,y)+f(x,y-1);

具体方法注释在代码上了:


#include<bits/stdc++.h>
using namespace std;
int x,y,n,m;//(x,y)为b点坐标,(n,m)为马的坐标
int p[30][30]={0};
long long f[30][30]={0};

int tx[9]={0,2,2,1,1,-1,-1,-2,-2};//马的八种走法加上本来处于的那个点
int ty[9]={0,1,-1,2,-2,2,-2,1,-1};

int main()
{
    //输入
    scanf("%d%d%d%d",&x,&y,&n,&m);
    x+=2;//防止越界,直接从2开始
    y+=2;
    n+=2;
    m+=2;
 
    //马对应的特殊点进行赋值,赋为一,表示不可走
    for(int i=0;i<9;i++)
    {
        int mx=n+tx[i];
        int my=m+ty[i];
        p[mx][my]=1;
    }
    //由于每个点是左边的条数加右边的条数,起始点也如此,
    //所以在起始点的左边或者上方任意一点赋为1即可
    f[2][1]=1;
    //递推的计算f(x,y)
    for(int i=2;i<=x;i++)
    {
        for(int j=2;j<=y;j++)
        {
            if(p[i][j]==1)
            {
                f[i][j]=0;
                continue;
            }
            f[i][j]=f[i-1][j]+f[i][j-1];
        }
    }
    //输出
    printf("%lld\n",f[x][y]);
    return 0;
}

**************************************************************************************************************

题目链接:P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动态规划。第十三次,动态规划,算法

思路:从上往下太复杂,直接从下往上看,上面一排的分别加上下面对应的两个数,哪个大哪个就更新哪个值,以此类推

看代码:


#include<bits/stdc++.h>
using namespace std;
//为了简单,从下往上看,倒数第二排的第一位数分别加倒数第一排的第一位数和第二位,
//哪个大就更新哪个值

int arr[1005][1005];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    for(int i=n-1;i>0;i--)
    {
        for(int j=1;j<=i;j++)
        {
            arr[i][j]=max(arr[i+1][j]+arr[i][j],arr[i+1][j+1]+arr[i][j]);
        }
    }
    printf("%d\n",arr[1][1]);
    return 0;
}

**************************************************************************************************************

2.29 

题目: P1802 5 倍经验日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动态规划。第十三次,动态规划,算法

思路:如下图,一个一个填上去会知道一整个流程是什么,分两种情况,一种是比对手多,则可以选择赢和不赢,比较赢和不赢那个大取哪个值,若比对手少只能输,则加上输的经验,并且每一个前面的都是算好的其最大的,所以不用去加很多层的了,直接去加一个就好了,就如if  esle里面的语句动态规划。第十三次,动态规划,算法

这里有很好的讲解:【五倍经验日【洛谷P1802】-哔哩哔哩】 https://b23.tv/wRz7wkX


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

long long a[1005][2];//代表输赢,【0】输,【1】
long long b[1005];  //用来储存至少使用的药数量
long long f[1005];   //获得的经验

int main()
{
    int n,x;
    scanf("%d%d",&n,&x);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld%lld",&a[i][0],&a[i][1],&b[i]);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=x;j>=0;j--)
        {
            if(j>=b[i])
            {
                f[j]=max(f[j]+a[i][0],f[j-b[i]]+a[i][1]);
            }
            else
            {
                f[j]+=a[i][0];
            }
        }
    }
    printf("%lld\n",5*f[x]);
    return 0;
}

**************************************************************************************************************

题目:P1616 疯狂的采药 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动态规划。第十三次,动态规划,算法

思路:用dp,用两个一维数组将数据分别存起来,然后dp【】里面的是时间,dp的值是最大价值,比较不采的与采药的价值取最大值,其中采药时的时间要花费了所以才会减去tim【i】

#include<bits/stdc++.h>
using namespace std;

long long tim[10005];//用来储存时间
long long v[10005];//用来储存价值
long long dp[10000005];//储存最大价值,注意!要用long long 
int main()
{
    int t,m;
    scanf("%d%d",&t,&m);//时间和草药数目
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld",&tim[i],&v[i]);
    }
    for(int i=1;i<=m;i++)//草药数目
    {
        for(int j=tim[i];j<=t;j++)
        {
            dp[j]=max(dp[j],dp[j-tim[i]]+v[i]);
        }
    }
    printf("%lld",dp[t]);
    return 0;
}

**************************************************************************************************************

题目:P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动态规划。第十三次,动态规划,算法

最长公共子序列:不要求元素之间连续

思路:【朴素法】

定义一个二维数组dp【i】【j】以【0,i-1】number1的长度,和以【0,j-1】长度的number2两串最长公共子序列

if(number1[i-1]==number2[j-1])

{d[i][j]=dp[i-1][j-1]+1;}

dp[i][j-1]【意思比如abc与ace少考虑e】    dp[i]-1[j]【意思比如abc与ace少考虑c】

把dp[i][0]和dp[0][j]初始化为0其他谁便初始化为啥都行,因为都会被覆盖

for(int i=1;i<=number1.size;i++)

for(int j=1;j<=number2.size;j++)

最终结果为:dp[number1.size()][number2.size()]; i

这是代码:显然是不适合这题的,需要进行优化

#include<bits/stdc++.h>
using namespace std;

int n1[100005];
int n2[100005];
int dp[10005][10005];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&n1[i]);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&n2[i]);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(n1[i]==n2[j])
            {
                dp[i][j]=dp[i-1][j-1]+1;
            }
            else
            {
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
    }
    printf("%d\n",dp[n][n]);
    return 0;
}

动态规划。第十三次,动态规划,算法

 优化后用一维数组,否则数据太多已经超出外面所承受的二维数组范围了

【暂时还没有会优化后的方法,等会了再补上,先交一下总结吧】文章来源地址https://www.toymoban.com/news/detail-839852.html

到了这里,关于动态规划。第十三次的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法第十五期——动态规划(DP)之各种背包问题

    目录 0、背包问题分类 1、 0/1背包简化版 【代码】 2、0/ 1背包的方案数 【思路】

    2023年04月09日
    浏览(41)
  • 【夜深人静学数据结构与算法 | 第十篇】动态规划

    目录 前言: 动态规划: 常见应用: 解题步骤:  动态规划的简化步骤: 案例: 509. 斐波那契数 - 力扣(LeetCode) 70. 爬楼梯 - 力扣(LeetCode) 62. 不同路径 - 力扣(LeetCode) 总结:         本文我们将为大家讲解一下动态规划的理论知识,并且会讲解几道力扣的经典例题。

    2024年02月11日
    浏览(53)
  • 【夜深人静学习数据结构与算法 | 第十二篇】动态规划——背包问题

      目录  前言:  01背包问题: 二维数组思路: 一维数组思路: 总结:       在前面我们学习动态规划理论知识的时候,我就讲过要介绍一下背包问题,那么今天我们就来讲解一下背包问题。 在这里我们只介绍 01背包 ,至于分组背包和混合背包这种的已经属于竞赛级别的

    2024年02月12日
    浏览(53)
  • 算法第十三天-解码方法

    来自【宫水三叶】 基本分析 我们称一个解码内容为一个 item 。 根据题意,每个 item 可以由一个数字组成,也可以由两个数字组成。 数据范围为100,很具有迷惑性,可能会有不少同学会想使用DFS进行暴力搜索。 我们可以大致分析一下这样子的做法是否可行:不失为一般性的

    2024年01月22日
    浏览(37)
  • 【马蹄集】第十六周——动态规划专题

    难度:钻石    时间限制:1秒    占用内存:128M 题目描述 给出一个长度为 n n n 的序列 A A A ,选出其中连续且非空的一段使得这段和最大。 格式 输入格式:第一行是一个整数,表示序列的长度 n n n ;      第二行有 n n n 个整数,第 i i i 个整数表示序列的第 i i

    2024年02月11日
    浏览(71)
  • 第十三周代码(动态规划1)(持续更新)

    动态规划第十二周也写了一部分,只不过忘记放上去了。 新的一年啦,看到这里砸个祝福:新年快乐,身体健康,考试顺利,心想事成! 【解题思路】 其实新出生半分钟吃一个是干扰项,实际上是一分钟吃一个 【参考代码】 【输出结果】  分为线性DP,状态压缩DP,数位

    2024年02月01日
    浏览(51)
  • 考研算法第十三天:二叉排序树 【二叉排序树的插入和遍历】

    这道题很妙。题目给的二叉排序树好像没学过其实就是二叉查找树。然后这道题主要的就是思路     1.先找到那个要删除节点所在处     2.找到之后处理分三种情况     删除的节点是叶节点,直接删除即可     删除的节点只有右节点或者左节点 将左节点或者右节点删除即可

    2024年02月05日
    浏览(50)
  • 秒懂百科,C++如此简单丨第十九天:动态规划

    目录 动态规划的初步理解 求最短路径数 洛谷 P1002 过河卒  题目描述 输入样例 输出样例  思路 AC Code The greatest glory in living lies not in never falling, but in rising every time we fall. 生命中最大的荣耀不在于从未跌倒,而在于每次跌倒后都能重新站起来。 什么是动态规划?最直白的理解

    2024年02月19日
    浏览(45)
  • 【运动规划算法项目实战】如何实现三次样条插值(附ROS C++代码)

    三次样条插值是一种广泛应用于数据拟合和插值的方法。它通过使用三次多项式在给定的一组数据点之间进行插值,以实现平滑的拟合效果。三次样条插值的优点是可以平滑地拟合给定的数据点,而不会产生震荡或振荡现象。 三次样条插值是机器人路径规划中常用的一

    2024年02月14日
    浏览(52)
  • (蓝桥杯第十一届决赛)试题D:本质上升序列(动态规划)

    先把题目中的字符串给出来:tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl 分析:虽然这只是一道填空题,但是我觉得这个还是有一定的思考意义的,所以我今天就把他

    2023年04月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包