动态规划-入门篇
来源:互联网 发布:php request method 编辑:程序博客网 时间:2024/06/06 06:51
虽说以前学过,但好久没练基本上忘光了,那我就从入门篇开始刷起吧。
Description
73 88 1 02 7 4 44 5 2 6 5(Figure 1)
Input
Output
Sample Input
573 88 1 0 2 7 4 44 5 2 6 5
Sample Output
30
Source
题目要求:
输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线。
规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个。
题目分析:我用map[i][j]代表三角形第i行j列的值,dp[i][j]代表从map[i][j]开始向下走的最大和,因此我们最终要求的最大和就是dp[0][0]。
代码:
#include<iostream>
using namespace std;
const int MAX=110;
int map[MAX][MAX]; //这个三角形
int dp[MAX][MAX];
int main()
{
int n;
while(cin >> n)
{
for(int i=0;i<n;++i)
{
for(int j=0;j<=i;++j)
{
cin >> map[i][j];
}
}
for(int i=0;i<n;++i)
{
dp[n-1][i] = map[n-1][i];
}
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;++j)
{
dp[i][j] = map[i][j] + max(dp[i+1][j],dp[i+1][j+1]);
}
}
cout << dp[0][0] << endl;
}
return 0;
}
接下来,我们在对这段代码进行优化,我们不需要一个二维数组来保存每一个数字的最大和,首先我们用数组dp指向三角形的最后一行map[n-1],然后从最底层开始循环,逐步填充dp数组,最后最大和就是dp[0]
代码:
#include<iostream>
using namespace std;
const int MAX=110;
int map[MAX][MAX];
int *dp;
int main()
{
int n;
while(cin >> n)
{
for(int i=0;i<n;++i)
{
for(int j=0;j<=i;++j)
{
cin >> map[i][j];
}
}
dp = map[n-1];
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;++j)
{
dp[j]=max(dp[j],dp[j+1]) + map[i][j];
}
}
cout << dp[0] << endl;
}
return 0;
}
参考博客:http://blog.csdn.net/baidu_28312631/article/details/47418773
- 动态规划入门篇
- 动态规划入门篇
- 动态规划-入门篇
- 动态规划入门篇
- 关于动态规划(入门篇)
- 关于动态规划(入门篇)
- 转载:关于动态规划(入门篇)
- 状态压缩动态规划入门篇
- 动态规划 入门篇(一)
- 动态规划小入门
- 动态规划入门
- 动态规划入门
- 动态规划经典入门
- 动态规划 入门学习
- 动态规划入门
- 动态规划入门1
- 动态规划入门_hdu_1421
- 动态规划入门例子
- 二进制 2017/11/19
- asp.net:验证控件中ValidationExpression的写法
- 001_Java语言基础知识
- IO模型
- C++primer5 题3.25
- 动态规划-入门篇
- 全文搜索引擎 Elasticsearch 入门教程
- java 开发 idea spring->resource添加多个资源配置文件夹
- 浅谈数据分库分表之道
- intellij IDEA右键没有Git或svn处理方法
- hdoj 2066 一个人的旅行
- 关于在python中, 在同一个project中的同一个目录里面, 导入模块的问题
- 3 栈和队列-栈的定义(待更改)
- ### Error building SqlSession. ### The error may exist in sqlmap/User.xml