level 1

1.1题目

1.1.1题目描述

考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。



在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30

1.1.2输入

第1行:1个整数R(1<= R<=1000),表示行的数目。

接下来共R行,第i行有i个整数。所有的数均非负的且不大于100。

1.1.3输出

第1行:可以得到的最大的和。

1.1.4样例输入

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

1.1.5样例输出

30

1.1.6提示

这种题都要给你提示?

1.2分析

一道水的不能再水的 DP基础题…但是这么简单的题还是难道了蒟蒻的我…

1.2.1超时的搜索

嗯…是的,做这道题的时候我还不知道有DP这种东西…于是上场直接搜索:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,maxx,a[1005][1005];
void dfs(int x,int y,int sum)
{
    if(x>n){maxx=max(maxx,sum);return ;}
    dfs(x+1,y,sum+a[x][y]);
    dfs(x+1,y+1,sum+a[x][y]);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)scanf("%d",&a[i][j]);
    dfs(1,1,0);
    printf("%d",maxx);
}

然后…

于是瞬间蒙蔽…

1.2.2DP大法出现

两个月后~~

听说这题是用DP才能过的,于是马上自学了部分DP知识,瞬间懂了…

我们可以设f[i][j]" role="presentation" style="position: relative;">f[i][j]f[i][j]为顶向上到此点的最大值,可以列出转移方程

f[i][j]=max(f[i−1][j],f[i−1][j−1])" role="presentation" style="position: relative;">f[i][j]=max(f[i−1][j],f[i−1][j−1])f[i][j]=max(f[i−1][j],f[i−1][j−1])

答案即在f[n][i]" role="presentation" style="position: relative;">f[n][i]f[n][i]中的最大值上.

实现:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[3][1005][1005],maxx,head;
int main()
{
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
        scanf("%d",&a[1][i][j]);
    a[2][1][1]=a[1][1][1];
    for(int i=2;i<=n;i++)
        for(int j=1;j<=i;j++)
        {
            a[2][i][j]=a[1][i][j]+max(a[2][i-1][j-1],a[2][i-1][j]);
        }
    for(int i=1;i<=n;i++)
    {
        maxx=max(maxx,a[2][n][i]);
    }
    printf("%d",maxx);
    //print(head);
}

level 2

2.1题目

2.1.1题目描述

2.1.2输入

第1行:1个整数N,表示数字三角形的行数和列数(1 <= N <= 1000)

接下来N行,第i行有i个整数,表示数字三角形

2.1.3输出

第1行:1个整数,表示问题的最优解

2.1.4样例输入

5

1

3 6

9 9 1

5 5 2 3

2 9 7 6 1

2.1.5样例输出

30

2.1.5提示

看清楚题就很简单的QAQ

2.2分析

考试的时候看见数字三角形太兴奋以至于没法现题目改了(这数据也太坑了吧233…)

额,貌似多加了一个最多一次走到任意格子上呀…..

其实我们可以再定义一个数组q[i][j]表示使用一次机会从下到上后走到(i,j)时的最大花费,我们定义MAX_NUM为i行f数组的最大值

因此q[i][j]=max(MAX_NUM,max(q[i+1][j],q[i+1][j+1]))

注意,一定是f的最大值,因为需要保证只使用一次机会。

2.3实现

#include<bits/stdc++.h>//作死头文件专场
using namespace std;
int a[1005][1005],n,f[1005][1005],q[1005][1005];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
        {
            scanf("%d",&a[i][j]);
            f[i][j]=a[i][j];
            q[i][j]=a[i][j];
        }
    for(int i=n-1;i>=1;i--)
    {
        int maxx=0,qx=0;
        for(int j=1;j<=i+1;j++)
        if(maxx<f[i+1][j])
            maxx=f[i+1][j];
        for(int j=1;j<=i;j++)
        {
            f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];
            q[i][j]=max(maxx,max(q[i+1][j],q[i+1][j+1]))+a[i][j];
        }
    }
    printf("%d",max(f[1][1],q[1][1]));
}

level 3(制作中)

3.1题目

3.1.1题目描述

3.1.2输入

第1行:1个整数N,表示数字三角形的行数和列数(1 <= N <= 1000)

接下来N行,第i行有i个整数,表示数字三角形

3.1.3输出

第1行:1个整数,表示问题的最优解

3.1.4样例输入

5

0

0 1

0 1 0

1 0 0 0

0 0 0 1 0

3.1.5样例输出

3

2.1.6提示

仔细思考一下就能做出来的QAQ

3.2分析

填充中…

3.3代码实现

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
bool f[1005][1005][10];
int a[1005][1005],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]),a[i][j]%=10;
    for(int i=1;i<=n;i++)f[n][i][a[n][i]]=1;
    for(int i=n-1;i>=1;i--)
        for(int j=1;j<=i;j++)
            for(int k=0;k<=9;k++)
                if(f[i+1][j][k]||f[i+1][j+1][k])
                    f[i][j][(k+a[i][j])%10]=1;
    int ans=0;
    for(int i=9;i>=0;i--)if(f[1][1][i]){ans=i;break;}
    printf("%d",ans);
}

[动态规划]数字三角形(版本I-III)的更多相关文章

  1. 动态规划——数字三角形(递归or递推or记忆化搜索)

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

  2. Poj3176 Cow Bowling (动态规划 数字三角形)

    Description The cows don't use actual bowling balls when they go bowling. They each take a number (i ...

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

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

  4. [ACM_动态规划] 数字三角形(数塔)

    递归方法解决数塔问题 状态转移方程:d[i][j]=a[i][j]+max{d[i+1][j],d[i+1][j+1]} 注意:1\d[i][j]表示从i,j出发的最大总和;2\变界值设为0;3\递归 ...

  5. 动态规划略有所得 数字三角形(POJ1163)

    在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数 ...

  6. hihoCoder #1037 : 数字三角形 (动态规划)

    题目链接:https://hihocoder.com/problemset/problem/1037# 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋 ...

  7. 动态规划入门——数字三角形(Java)

    动态规划的概念对于新手来说枯燥难懂,就算看懂了,做题的时候依旧抓耳挠腮的毫无头绪,这些比较难理解的算法,还是需要根据例子来一步步学习和理解,从而熟练掌握,下面,咱们就通过一个简单的小例子来学习动态规划 ...

  8. Problem C: 动态规划基础题目之数字三角形

    Problem C: 动态规划基础题目之数字三角形 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 208  Solved: 139[Submit][Sta ...

  9. 动态规划之数字三角形(POJ1163)

    在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 既然求目标问题是根据查表得来的,自然 ...

随机推荐

  1. Telephone Lines [POJ3662] [二分答案]

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  2. CSS3_综合案例

    综合案例 设置元素的 width,还可以利用 left 和 right 为了防止图片太小,background-size: 100% 100%; <!DOCTYPE html> <h ...

  3. 前端性能优化 —— reflow(回流)和repaint(重绘)

    简要:整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow(回流)和repaint(重绘) 会大大影响web性能,尤其是手机页面.因此我们在页面设计的时候要尽量 ...

  4. python2和python3 安装pip冲突问题

    系统:win10 问题:安装python2和Python3后 在cmd 中 pip和python命令会冲突 原因:先安装的python3,python3会自动配置path安装pip,pip和pytho ...

  5. 日期求星期(java)-蓝桥杯

    日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...

  6. python 中的类

    1.1 类里面包括:类的属性.方法 OO的特征(Object Oriented) 封装:信息隐蔽技术 继承:继承是子类自动共享父类之间数据和方法的机制 >>> class MyCla ...

  7. 一个简单的分布式session框架

    该代码只是用来学习原理的,有很多不完善之处. 代码:  git@github.com:sicw/EasySpringSession.git 一. 整体设置 1. 实现Filter,封装新的reques ...

  8. wx.createSelectorQuery() 获取节点信息 获取不到解决方法

    场景:一个气泡的宽度由加载来的数据填充所决定,不定宽,     wx.createSelectorQuery().selectAll('.talkbubble').boundingClientRect ...

  9. Windows10 ntoskrnl.exe占用大量的磁盘空间(100%)

    一.解决办法: 1.此电脑(右键)>  管理(点击)> 系统工具 > 任务计划程序 > 任务计划程序库 > Microsoft > windows > .NE ...

  10. 透过实现小型打包工具理解webpack

    面试经常有问到 webpack,偶遇一篇比较有实用价值的且有利于理解的文章,现总结如下: 本篇文章中要实现的这个迷你打包工具,它主要能实现如下两个功能: ①.将 ES6 转换成 ES5: ②.支持在 ...