[动态规划]数字三角形(版本I-III)
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)的更多相关文章
- 动态规划——数字三角形(递归or递推or记忆化搜索)
动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个 ...
- Poj3176 Cow Bowling (动态规划 数字三角形)
Description The cows don't use actual bowling balls when they go bowling. They each take a number (i ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- [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\递归 ...
- 动态规划略有所得 数字三角形(POJ1163)
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数 ...
- hihoCoder #1037 : 数字三角形 (动态规划)
题目链接:https://hihocoder.com/problemset/problem/1037# 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋 ...
- 动态规划入门——数字三角形(Java)
动态规划的概念对于新手来说枯燥难懂,就算看懂了,做题的时候依旧抓耳挠腮的毫无头绪,这些比较难理解的算法,还是需要根据例子来一步步学习和理解,从而熟练掌握,下面,咱们就通过一个简单的小例子来学习动态规划 ...
- Problem C: 动态规划基础题目之数字三角形
Problem C: 动态规划基础题目之数字三角形 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 208 Solved: 139[Submit][Sta ...
- 动态规划之数字三角形(POJ1163)
在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 既然求目标问题是根据查表得来的,自然 ...
随机推荐
- C++ 简单的控制台贪吃蛇小游戏
由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...
- VB中Winsock连续发送出现接收不到的异常问题解决方法
VB里面用WINSOCK进行一对多连接的TCP连接时,经常需要群发消息给所有已连接的客户端.代码类似如下: Option Explicit Dim bytMsg() As Byte Private S ...
- Class.forName()+Class.forName().newlnstance()和new语句和初始化块+static初始化块+构造方法之间的关系
先上代码 class A{ int a; static {System.out.println("载入类时执行");} public A() { ...
- pytorch, LSTM介绍
本文中的RNN泛指LSTM,GRU等等 CNN中和RNN中batchSize的默认位置是不同的. CNN中:batchsize的位置是position 0. RNN中:batchsize的位置是pos ...
- 输入、输出与Mad Libs 游戏。
name1=input('请输入一个名字:') name2=input('再输入一个名字:') time1=input('请输入一段时间:') print('{},是傻子,{},{}吃不了鸡'.for ...
- ASP.NET 创建WebService——简单例子
Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...
- 汇编入门——使用DOSBox写一个HelloWorld以及相关软件安装
0.0.0) 在D盘建立一个ASM文件夹 0.0.1) 放入所需要的文件 1所标示的红色框为必须要存在的文件,要处理汇编文件.百度网盘中下载. 2自己编写的汇编(asm)文件. 3编译汇编自己生成的文 ...
- [ipsec][crypto] 什么是AEAD加密算法中的AAD 及aad length
AAD 全称:Additianal Authenticated Data 翻译成中文就是附加的验证数据. 在理解AAD之前,需要理解什么是AEAD: AEAD,简单的来说就是一份数据在完成加密的时候同 ...
- 美团笔试(web前端)
分为3部分: 1.逻辑推理.行测.找规律: 2.html css javascript的简单的选择题,以及数据结构,操作系统方面的知识: 3.两道编程题,第一道题关于竞赛报名,有限制的分组,输入N和M ...
- python基础语法-->多项分支-->巢状分支
# ### 多项分支 """ if 条件表达式: codel1... codel1... else 条件表达式 coedl2.. coedl2.. else 条件表达式 ...