(dp)数字三角形

      • 题目
      • 方案1:递归
      • 方案二:递推

题目

数字三角形问题。有一个由非负整数组成的三角形,第一行只有一个数,除了最下行 之外每个数的左下方和右下方各有一个数
从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数 全部加起来。如何走才能使得这个和尽量大?
这里写图片描述

具体实现代码中的d我们用maxsum表示
最初的位置我们用d存

1.把当前的位置(i, j)看成一个状态 ,然后定义状态(i, j)的指标函数d(i, j)为从格子(i, j)出发时能得到的最大和 (包括格子(i, j)本身的值)。在这个状态定义下,原问题的解是d(1, 1)。
2.不同状态之间是如何转移的。从格子(i, j)出发有两种决策。如果往左走,则走 到(i+1, j)后需要求“从(i+1, j)出发后能得到的最大和”这一问题,即d(i+1, j)。类似地,往右走之后需要求解d(i+ 1 , j+1)。由于可以在这两个决策中自由选择,所以应选择d(i+1,j) 和d(i+1,j+1)中较大的一个。
3.状态转移方程:d(i,j)=a(i,j)+max{d(i+1,j),d(i+1,j+1)}
4.如果往左走,那么最好情况等于(i, j)格子里的值a(i, j)与“从(i+1, j)出发的最大总和”之 和,注意这里的“最大”二字。如果连“从(i+1,j)出发走到底部”这部分的和都不是最大 的,加上a(i, j)之后肯定也不是最大的。这个性质称为最优子结构(optimal substructure), 也可以描述成“全局最优解包含局部最优解”
5.状态和状态转移方程一起完整地描 述了具体的算法。

方案1:递归

可以用记忆化搜索的方法计算状 态转移方程。当采用记忆化搜索时,不必事先确 定各状态的计算顺序,但需要记录每个状态“是 否已经计算过”。
题目中说各个数都是非 负的,因此如果已经计算过某个d[i][j],则它应是非负的。这样,只需把所有d初始化为- 1,即可通过判断是否d[i][j]!=-1得知它是否已经被计算过。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxx 101
int d [maxx][maxx];
int n;
int maxsum[maxx][maxx];
int ms(int i,int j); 
int main()
{int i,j;cin>>n;for(i=1;i<=n;++i)for(j=1;j<=i;++j){cin>>d[i][j];maxsum[i][j]=-1;}cout<<ms(1,1)<<endl;} int ms(int i,int j)
{if(maxsum[i][j]!=-1)return maxsum[i][j];//保存算过的 赋值语句本身有返回值”的规定,//可以把maxsum[i][j]的工作合并到函数的返回语句中。if(i==n)maxsum[i][j]=d[i][j];else {int y=ms(i+1,j+1);int x=ms(i+1,j);maxsum[i][j]=max(x,y)+d[i][j];}return maxsum[i][j];
}

方案二:递推

i是 逆序枚举 的,因此在计算d[i][j]前,它所需要的d[i+1][j]和d[i+1][j+1]一定已经计算出来了。

最底下的元素d(i,j)的maxsum[i][j]一定是他自身
这样我们可以自下而上地推出每一个d(i,j)的maxsum

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxx 101
int d [maxx][maxx];
int n;
int maxsum[maxx][maxx];int main()
{
    int i,j;
    cin>>n;
    for(i=1;i<=n;++i)
        for(j=1;j<=i;++j)
        {
            cin>>d[i][j];
        }
    for(i=1;i<=n;++i)
        maxsum[n][i]=d[n][i];
    for(i=n-1;i>=1;--i)
        for(j=1;j<=i;++j)
            maxsum[i][j]=max(maxsum[i+1][j],maxsum[i+1][j+1])+d[i][j];
    cout<<maxsum[1][1]<<endl;} 

用一维数组存:

//直接用d的第n行代替
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxx 101
int d [maxx][maxx];
int n;
int  *maxsum;int main()
{int i,j;cin>>n;for(i=1;i<=n;++i)for(j=1;j<=i;++j){cin>>d[i][j];}maxsum=d[n];for(i=n-1;i>=1;--i)for(j=1;j<=i;++j)maxsum[j]=max(maxsum[j],maxsum[j+1])+d[i][j];cout<<maxsum[1]<<endl;} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mfc tabcontrol 修改白色背景_初级会计报名准备工作如何使用美图秀秀PC版修改照片尺寸、格式、大小...

点击上方蓝字关注我们证件照是我们生活中常用的东西&#xff0c;大学考证需要证件照&#xff0c;制作简历也需要用到证件照&#xff0c;工作有时也需要用到&#xff0c;然而最让我们头疼的是每次报名证件照的要求都不一样&#xff0c;其中底色和尺寸是经常需要修改的&#xff0…

分步表单_表单设计-掌握表单设计方法(表单体验篇)

全篇阅读大概需要15min&#xff0c;对表单设计不熟悉的同学看完后肯定会有不少的收获~~~说到表单其实在生活中可以接触到各种各样的表单&#xff0c;比如&#xff1a;驾照申请表、体检表、银行开户需要填写的表等等&#xff0c;这些都是表单&#xff0c;主要目的就是让用户填写…

4)lsof linux命令,***Linux命令实时监测系统(top,htop,iotop,lsof,tcpdump,netstat,vmstat,iostat)...

摘要&#xff1a;本文总结了8个非常实用的Linux命令行性能监测工具&#xff0c;这些命令支持所有的Linux系统&#xff0c;不仅可以用于监控系统&#xff0c;还可以发现导致性能问题的原因所在。对每个系统/网络管理员来说&#xff0c;每天监测Linux系统性能是一项非常艰巨的任务…

算法竞赛入门经典 第七章 总结

目录&#xff1a; 7.1 简单枚举7.2 枚举排列7.3 子集生成 7.1 简单枚举 例题7-1 除法&#xff08;Division, UVa 725&#xff09; 输入正整数n&#xff0c;按从小到大的顺序输出所有形如abcde/fghij n的表达式&#xff0c;其中a&#xff5e;j恰好 为数字0&#xff5e…

线性表总结

线性表及其实现多项式的表示什么是线性表线性表的抽象数据类型描述线性表的顺序存储实现线性表的链式存储实现 线性表及其实现 多项式的表示 [例] 一元多项式及其运算 一元多项式 &#xff1a; 主要运算&#xff1a;多项式相加、相减、相乘等 【分析】如何表示多项式?…

mix2s android p功能,已升安卓P!网友:MIX2S才是亲儿子

原标题&#xff1a;已升安卓P&#xff01;网友&#xff1a;MIX2S才是亲儿子一直以来&#xff0c;小米在手机系统更新上都有着非常明显的优势&#xff0c;MIUI经过了多年的更新迭代&#xff0c;如今已经达到了非常不错的易用性&#xff0c;而且流畅度方面的表现更是优秀。如今小…

堆栈总结

堆栈什么是堆栈堆栈的抽象数据类型描述栈的顺序存储实现 堆栈 什么是堆栈 计算机如何进行表达式求值&#xff1f; 算术表达式56/2-3*4。 正确理解&#xff1a; 56/2-3*4 53-3*4 8-3*4 8-12 -4 由两类对象构成的&#xff1a; 运算数&#xff0c;如2、3、4 运算符号…

harmonyos公测招募,nova为主 HarmonyOS 2.0开发者Beta公测再招募

原标题&#xff1a;nova为主 HarmonyOS 2.0开发者Beta公测再招募HarmonyOS 2.0开发者Beta公测招募将开启第二期&#xff0c;本次公测活动主要针对的机型是华为nova系列。活动报名时间为5月9日-5月17日。【PChome手机频道资讯报道】华为方面在4月份开启了HarmonyOS 2.0开发者Bet…

队列总结

什么是队列 队列(Queue)&#xff1a;具有一定操作约束的线性表 插入和删除操作&#xff1a;只能在一端插入&#xff0c;而在另一端删除 数据插入&#xff1a;入队列&#xff08;AddQ&#xff09; 数据删除&#xff1a;出队列&#xff08;DeleteQ&#xff09; 先来先服务 先…

D P- 免费馅饼

题目 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了&#xff0c;所以ga…

一加桌面3.0 android8,一加手机XRemix6.0安卓8.1.0Beta2.0定制本地化增强适配归属农历等...

制作者&#xff1a;moonlight-roms基于版本&#xff1a;remix最新安卓8.1.0代码适合机型&#xff1a;一加手机X双网版/全网通版/E1001/E1003等/onyx注意事项&#xff1a;1.开机后语言设置&#xff1a;Settings-system-languageandinput-添加一个中文需要并拖动到第一行设置为默…

震惊!Fibonacci Again

题目 There are another kind of Fibonacci numbers: F(0) 7, F(1) 11, F(n) F(n-1) F(n-2) (n>2). Input Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000). Output Print the word “yes” if 3 divide evenly into …

华为鸿蒙手机和电视通话,鸿蒙智慧屏首秀:逾10万人预定,电视视频通话功能强大...

原标题&#xff1a;鸿蒙智慧屏首秀&#xff1a;逾10万人预定&#xff0c;电视视频通话功能强大上周五&#xff0c;大家期待已经的华为开发者大会正式召开&#xff0c;华为鸿蒙系统在这一天对外发布。历时数年&#xff0c;经过几千人的研发&#xff0c;终于正式落地。曾经&#…

两文本一图片android,Android富文本编辑器(二):图文混排以及图片上传处理

对于一个富文本编辑器来说&#xff0c;图文混排是最基本的功能。而从上一篇文章中我们知道图文混排需要使用ImageSpan。下面这段代码摘自我的RichEditText源码&#xff1a;/*** 添加图片* param filePath 图片文件路径*/public void addImage(String filePath) {SpannableStrin…

震惊! Rightmost Digit 快速幂解决

题目 Given a positive integer N, you should output the most right digit of N^N. Input The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case conta…

android handler同步,android解决:使用多线程和Handler同步更新UI

如果运行时&#xff0c;可以看到滚动条由条慢慢变短&#xff0c;则说明程序成功了。截图如下&#xff0c;建议选择大点的文件做测试。main.xmlxmlns:android"http://schemas.android.com/apk/res/android"android:layout_height"wrap_content" android:id&…

html玫瑰花效果代码,html5渲染3D玫瑰花情人节礼物js特效代码

情人节马上就要到来了&#xff0c;这里给程序员前端设计师们献上一个&#xff0c;html5渲染而成的3D玫瑰花js效果&#xff0c;可以作为虚拟的情人节礼物送给自己的爱人。支持html5的浏览器查看。查看演示下载资源&#xff1a;16次 下载资源下载积分&#xff1a;20积分情人节玫瑰…

html 页面怎么加载富文本,UILabel加载html富文本

本文主要解决html标签之外文本属性设置当APP里面有搜索的需求的时候&#xff0c;产品可能会要求关键字显示特殊颜色或者字体。其中一种可能性是服务器返回的数据是带有html标签的字符串&#xff0c;那么该怎么解决&#xff1f;当标签之外的其他字体也需要设置不同格式&#xff…

python 打印皮卡丘_用python打印你的宠物小精灵吧

我们来通过一个有趣的例子开始编写我们的第一个python代码。本文涉及的python基础语法为&#xff1a;print输出函数&#xff0c;赋值&#xff0c;字符串print()print()是python的一个内置函数&#xff0c;用于打印输出&#xff0c;是最常见的一个函数之一。有些朋友可能对于打印…

360浏览器查看html文件在哪里,360浏览器8菜单栏怎么弄出来?如何查看网站源代码...

今天想查看一个页面的源代码&#xff0c;没想到这个页面竟然禁止了鼠标右键功能&#xff0c;所以无法通过鼠标右键选择“查看源代码”来查看。然后就想通过 360 浏览器的“查看源代码”按钮进行查看&#xff0c;没想到找了半天都找不到这个按钮&#xff0c;最后只能通过查看源代…