hdu 2084 数塔问题(动态规划)
2013-09-27 08:44
381 查看
问题描述:
在讲述DP算法的时候,一个经典的例子就是数塔问题
有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。
输入:
整数N表示数塔的高度,接下来用N行数字表示数塔,其中第i行有i个整数
输出:
路径中最大的和
分析:
自顶向下的分析,确实太暴力了,假设有31行,则有2^30条路径,会发现从上往下总要先知道该路径上所有值的和,比较后才可确定,
换种思路,从下往上比较,;例如上例,最后一行,19>7,故舍掉7,2变成2+19=21;同理7<10,18变成18+10=28......以此类推.....
代码://最后输出时注意下回车,该题是最后一个数也要回车换行
#include<iostream>
using namespace std;
int main()
{
int c,i,j,t;
int dp[100][100];
cin>>c;//表示实例个数
int *a=new int[c];//动态定义数组
for(t=0;t<c;t++)
{
memset(dp,0,sizeof(dp));
cin>>a[t];
for(i=0;i<a[t];i++)
{
for(j=0;j<i+1;j++)
{
cin>>dp[i][j];//输入数据
}
}
for(i=a[t]-1;i>0;i--)
{
for(j=0;j<i;j++)
{
if(dp[i][j]<=dp[i][j+1]) dp[i-1][j]+=dp[i][j+1];
else dp[i-1][j]+=dp[i][j]; //由下往上每一行逐个比较,较小的这一分支会去掉,并且把数值之和放到上一行
}
}
a[t]=dp[0][0];//最顶端的数字存放的是由下往上累计上来的为最终的和
}
for(t=0;t<c;t++)
{
//if(t==c-1) cout<<a[t];
//else
cout<<a[t]<<endl;
}
delete a;//释放动态内存
return 0;
}
在讲述DP算法的时候,一个经典的例子就是数塔问题
有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。
输入:
整数N表示数塔的高度,接下来用N行数字表示数塔,其中第i行有i个整数
输出:
路径中最大的和
分析:
自顶向下的分析,确实太暴力了,假设有31行,则有2^30条路径,会发现从上往下总要先知道该路径上所有值的和,比较后才可确定,
换种思路,从下往上比较,;例如上例,最后一行,19>7,故舍掉7,2变成2+19=21;同理7<10,18变成18+10=28......以此类推.....
代码://最后输出时注意下回车,该题是最后一个数也要回车换行
#include<iostream>
using namespace std;
int main()
{
int c,i,j,t;
int dp[100][100];
cin>>c;//表示实例个数
int *a=new int[c];//动态定义数组
for(t=0;t<c;t++)
{
memset(dp,0,sizeof(dp));
cin>>a[t];
for(i=0;i<a[t];i++)
{
for(j=0;j<i+1;j++)
{
cin>>dp[i][j];//输入数据
}
}
for(i=a[t]-1;i>0;i--)
{
for(j=0;j<i;j++)
{
if(dp[i][j]<=dp[i][j+1]) dp[i-1][j]+=dp[i][j+1];
else dp[i-1][j]+=dp[i][j]; //由下往上每一行逐个比较,较小的这一分支会去掉,并且把数值之和放到上一行
}
}
a[t]=dp[0][0];//最顶端的数字存放的是由下往上累计上来的为最终的和
}
for(t=0;t<c;t++)
{
//if(t==c-1) cout<<a[t];
//else
cout<<a[t]<<endl;
}
delete a;//释放动态内存
return 0;
}
相关文章推荐
- 动态规划:数塔问题 hdu 2084 dp
- 动态规划:HDU1712-ACboy needs your help(分组背包问题)
- HDU-2084 - 数塔 - 动态规划
- HDU 1203 I NEED A OFFER![动态规划——01背包问题+简单概率]
- hdu 1574 RP问题 动态规划,01背包的变形
- HDU-2084(数塔)(动态规划)
- HDU2084 数塔 动态规划入门-递推
- hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)
- HDU 2084 数塔 动态规划解法
- HDU 2084 DP经典例子---数塔问题
- [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
- HDU2084 简单的 动态规划
- hdu 2084 dp入门 数塔问题
- HDU 2084 数塔(动态规划)
- 数塔 【hdu-2084】【动态规划】
- HDU 1159 最长公共子序列问题 动态规划
- HDU 1024 Max Sum Plus Plus(动态规划,给定一个数组,求其分成m个不相交子段和最大值的问题)
- HDU 1003 区间最大和问题(动态规划)
- HDU 1159 最长公共子序列问题 动态规划
- HDU 2084 数塔 动态规划