趣学算法——动态规划算法

本文围绕算法学习展开,重点介绍动态规划算法,其通过利用子问题信息求当前问题最优解。还给出一道算法题,要求找出从最高点到底部路径数字和最大的路径。解题运用动态规划思想,给出状态转移方程,最后总结做动态规划题的方法。

14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~

算法知识点

动态规划算法(DP)
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的.
换句话说就是通过利用已有的子问题信息高效求出当前问题的最优解。所以,这种多阶段最优化决策解决问题的过程就称为动态规划(DP)。

算法题目描述

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

        7 
      3   8 
    8   1   0 
  2   7   4   4 
4   5   2   6   5 
在上面的样例中,从7→3→8→7→5 的路径产生了最大

做题思路

通过阅读题目我们会发现我们需要求从顶端走到最下面的数字和最大,这就可以通过动态规划的思想,每次更新状态,最后找到数字和最大的状态。
因此我们可以想到一种状态转移是从第二行开始每个地方都求取一下
每一个状态都是由上一行对应的两个位置转移而来
因此我们可以得到状态转移方程为
dp[i][j]=max(a[i-1][j],a[i-1][j-1])+a[i][j]

请添加图片描述

AC代码

#include<bits/stdc++.h>
using namespace std;
int h;
int dp[1110][1110];
int a[1110][1110];
int ans;
int main()
{
    cin>>h;
    for(int i=1;i<=h;i++)
        for(int j=1;j<=i;j++)cin>>a[i][j];
    
    for(int i=1;i<=h;i++)
        for(int j=1;j<=i;j++)
        {
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
        }
    for(int i=1;i<=h;i++)ans=max(ans,dp[h][i]);
    cout<<ans;
    return 0;
}

题目总结

遇到动态规划(DP)类的题目的时候一定要稳定心态,想一想状态转移方程怎么写,然后将程序写出来之后试验数据,最后解决问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值