动态规划的核心就是状态和状态转移方程。

对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值)。

在这个状态定义下,原问题的解就是d(i,j).

下面看一下不同状态之间如何转移。从格子(i,j)出发有两种策略。如果向左走,则到(i+1,j)后需要求“从(i+1,j)出发能得到的最大和”这一问题,即d(i+1,j)。

类似的,往右走之后需要求解d(i+1,j+1).由于可以在这两个决策中自由选择,所以应选择其中较大者。换句话说就是得到状态转移方程

d(i,j)=a(i,j)+Max(d(i+1,j),d(i+1,j+1))

这样就保证了子树的最优,这个性质称为最优子结构。

用直接递归的方法计算状态转移方程,效率往往十分低下。其原因是相同的子问题被重复计算了多次。

因此我们对其优化采用了递推算法或者采用记忆搜索的方式。

递推计算就是把每个问题直接罗列出来,因此不会重复。

记忆搜索的程序依然是递归的,但是把计算结果放在了数组d中。开始将所有状态置为-1,只要是计算过的状态就就变成非负,因此只要判断是否d[i][j]>=0,就知道它是否计算过。

#include<iostream>
#include<string>
using namespace std;
void input(int a[][10],int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            cin>>a[i][j];
        }
    }
}
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
/*******************i表示当前行数,j表示当前列数,n表示规格****************************/
/**********d(i,j)表示状态,d(i,j)=a(i,j)+Max(d(i+1,j),d(i+1,j+1))为状态转移方程*********/
int d(int a[][10],int i,int j,int n)
{
    if(i>=n)
        return 0;
    else
    {
        return a[i][j]+max(d(a,i+1,j,n),d(a,i+1,j+1,n));
    }
}
/**************采用递推计算,i表示当前行数,j表示当前列数,n表示规格**********************************/
int d1(int a[][10],int n)
{
    int i,j;
    int b[10][10];
    for(i=0;i<=n;i++)
        b[n][i]=0;        //将b(n,0~n)状态全部赋值为0
    for(i=n-1;i>=0;i--)
    {
        for(j=0;j<=i;j++)
        {
            b[i][j]=a[i][j]+max(b[i+1][j],b[i+1][j+1]);
        }
    }
    return b[0][0];
}

/*************采用记忆化搜索*************************/
int d2(int a[][10],int b[][10],int i,int j,int n)
{
    if(b[i][j]>=0)
        return b[i][j];
    else
    {
        if(i>=n)
            return 0;
        else
            return b[i][j]=a[i][j]+max(d2(a,b,i+1,j,n),d2(a,b,i+1,j+1,n));
    }
}
int main()
{

    int a[10][10];
    int b[10][10];
    memset(b,-1,sizeof(b));
    int n;
    cout<<"请输入总共有多少行"<<endl;
    cin>>n;
    input(a,n);
    cout<<d(a,0,0,n)<<endl;
    cout<<d1(a,n)<<endl;
    cout<<d2(a,b,0,0,n)<<endl;
    return 0;
}

动态规划——数字三角形(递归or递推or记忆化搜索)的更多相关文章

  1. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  2. 洛谷 P1464 Function【动态规划(递推)/记忆化搜索(递归)】

    题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...

  3. luogu P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles (递推)

    链接:https://www.luogu.org/problemnew/show/P1216 题面: 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的 ...

  4. DFS——>记忆化搜索——>动态规划

    以洛谷P1802  5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...

  5. poj1163The Triangle(动态规划,记忆化搜索)

    7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calc ...

  6. Chapter1 递归与递推

    Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...

  7. 由DAG到背包问题——记忆化搜索和递推两种解法

    一.问题描述 物品无限的背包问题:有n种物品,每种均有无穷多个.第 i 种物品的体积为Vi,重量为Wi.选一些物品装到一个容量为 C 的背包中,求使得背包内物品总体积不超过C的前提下重量的最大值.1≤ ...

  8. [每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式

    题目链接 题意 : 求斐波那契数列第n项 很简单一道题, 写它是因为想水一篇博客 勾起了我的回忆 首先, 求斐波那契数列, 一定 不 要 用 递归 ! 依稀记得当年校赛, 我在第一题交了20发超时, ...

  9. 【CF607B】Zuma——区间dp(记忆化搜索/递推)

    以下是从中文翻译成人话的题面: 给定一个长度小于等于500的序列,每个数字代表一个颜色,每次可以消掉一个回文串,问最多消几次可以消完? (7.16) 这个题从洛谷pend回来以后显示有103个测试点( ...

随机推荐

  1. how to use http.Agent in node.js

    Actually now that I look at the Agent code, it looks like it sets maxSockets on a per domain basis i ...

  2. struts2_20140720

    有这样的感觉:前面学的东西弄会了,过了一段时间又感觉陌生了,还要重新开始.这次想个好办法,把写的程序用博客记录下来,把自己的学历历程用博客的形式呈现出来,一来可以方便复习,而来可以以后开发程序可以快速 ...

  3. Error: Linux下 mysql.sock文件丢失被删除解决方法

    在默认情况下,Mysql安装以后会在/tmp目录下生成一个mysql.sock文件,如该文件丢失则Mysql将不能够正常启动,解决方法:使用mysqld_safe 启动即可解决: #basedir:m ...

  4. 网站被百度和google封了,怎么办?

    很多站长总是抱着侥幸的心里,通过作弊的方式在搜索引擎上获得一定排名,以致于网站被百度和google封了,也就是所谓的被K站. 那么,要是网站被百度和Google封了,怎么办? 首先要确定你的网站已经被 ...

  5. Redmine backlogs 安装

    之前我们一直用IceScrum的免费版本来运作Scrum项目,用GitLab来做做Issue管理,但是出现了一些问题.GitLab的issue不够好用,不能满足我们的需求,同时issue没有办法放在S ...

  6. svm中的数学和算法

    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出很多特有的优势,并可以推广应用到函数拟合等其它 ...

  7. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...

  8. plaidctf2015 uncorrupt png

    代码的执行时间挺长的,好囧! 参考了https://13c5.wordpress.com/2015/04/20/plaidctf-2015-png-uncorrupt/的代码 通过这个题目,也对Png ...

  9. LeetCode Day1

    Palindrome Linked List /** * LeetCode: Palindrome Linked List * Given a singly linked list, determin ...

  10. 总结一下.net framework适合装在哪些系统中

    最近在客户这部署,环境是windows server2003 service pack2.因为vs2012开发环境是.net framework4.5,所以发布iis的时候,尝试在sever2003上 ...