c++ 动态规划(dp)

题目描述

观察下面的数塔。写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大。

每一步可以从当前点走到左下角的点,也可以到达右下角的点。

输入

5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11

输出

86

AC代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 505;
int dp[MAXN][MAXN],a[MAXN][MAXN];
int max(int a,int b)//max函数求两个数字之间的最大值
{
return a>b?a:b;
}
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i ++)//输入
{
for (int j = 1;j <= i;j ++)
{
cin >> a[i][j];
}
}
dp[1][1] = a[1][1];//把起点直接放在dp[]里面
for (int i = 2;i <= n;i ++)
{
for (int j = 1;j <= i;j ++)
{
dp[i][j] = max(dp[i - 1][j - 1],dp[i - 1][j]) + a[i][j];//dp公式,原理是先走一步,然后扫描这个点的上一层的邻接点看看哪个点的dp值最大,然后用最大值加上他本身
}
}
int ans = 0;
for (int i = 1;i <= n;i ++)
{
ans = max(ans,dp[n][i]);//ans的作用是在最底部的元素中找一个最大的dp,输出
}
cout << ans << endl;
return 0;
}

另外一种方法

#include <iostream>
#include <string>
#include <algorithm>//STL库函数
using namespace std;
int main()
{
int t,n,dp[105][105],a[105][105];
cin >> t;//t组数据
while (t --)//重复执行直到t组数据都处理完
{
cin >> n;//塔的层数
for (int i = 1;i <= n;i ++)//输入
{
for (int j = 1;j <= i;j ++)
{
cin >> a[i][j];//把塔转化成数组
}
}
memset(dp,0,sizeof(dp));//把dp的值初始化为0
for (int i = 1;i <= n;i ++)//把a[]最后一行赋值到dp[],因为最后一行的dp[]就等于最后一行数本身
{
dp[n][i] = a[n][i];
}
for (int i = n - 1;i >= 1;i --)
{
for (int j = 1;j <= i;j ++)
{
dp[i][j] = max(dp[i + 1][j + 1],dp[i + 1][j]) + a[i][j];//dp公式,原理是扫描这个点的下一层的邻接点看看哪个点的dp值最大,然后用最大值加上他本身,在把大的值选中
}
}
}
cout << dp[1][1] << endl;//输出
return 0;
}

c++ 动态规划(数塔)的更多相关文章

  1. [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\递归 ...

  2. HDU 2084 数塔(动态规划)

    数塔 http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描 ...

  3. [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]

    Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...

  4. 数塔(hdoj 2084,动态规划递推)

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...

  5. ACM 杭电HDU 2084 数塔 [解题报告]

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  6. 数塔,杭电oj-2048

    原题地址:http://i.cnblogs.com/EditPosts.aspx?postid=4077291 [Problem Description] 在讲述DP算法的时候,一个经典的例子就是数塔 ...

  7. 数塔~~dp学习_1

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  8. Hdoj 2084.数塔 题解

    Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...

  9. 数字三角形/数塔问题(DP入门题)

    有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大. 样例输入: 5 13 11 8 12 7 26 6 14 15 8 12 7 ...

随机推荐

  1. c# 将字符串转换为指定类型的值

    private object GetValueByProperty(string key, string value, ref Type typeValue) { Type t = typeof(T) ...

  2. mysql自动安装教程说明

    这里只说明了思路和方法 我们在安装程序里面可能需要安装的时候将mysql一起安装,那么我们就按照下面的顺序思路来. 首先我们安装的电脑上可能已经安装了mysql,所以我们的mysql服务就起一个名字, ...

  3. 模态对话框测试 MFC中的模态对话框与非模态对话框

    http://blog.csdn.net/u010839382/article/details/52972427 http://blog.csdn.net/u010839382/article/det ...

  4. 【转载】Chrome使用自定义协议打开本地程序并运行IE打开网页

    部分内容转载自: http://blog.sina.com.cn/s/blog_e2b8213a0102wqby.html 项目中遇到某需求:chorme要运行IE并打开网页.解决方案之一就是通过自定 ...

  5. Python基础(七) 闭包与装饰器

    闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...

  6. spring 5.x 系列第18篇 —— 整合websocket (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 项目模拟一个简单的群聊功能,为区分不同的聊 ...

  7. 一道关于String的面试题,新鲜出炉,刚被坑过,趁热!!

    很多人都会答错的一道关于String的题目,究竟有什么难度? 我们一起来看一道关于String的面试题,准确说是改编的面试题! 准备好啦?在放大招之前先来一个小招式 String s1 = new S ...

  8. asyncio系列之sleep()实现

    先来看个例子,自己实现的模拟耗时操作 例1 import types import select import time import socket import functools class Fu ...

  9. 获取浏览器ip地址

    <script src="http://lib.sinaapp.com/js/jquery/1.8.3/jquery.min.js"></script> & ...

  10. 利用LDAP操作AD域

    LDAP操作代码样例  初始化LDAP 目录服务上下文 该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ld ...