hdu-1087 Super Jumping! Jumping! Jumping!

本文解析了 HDU-1087 的算法问题,通过动态规划的方法来寻找从起点到终点路径上的最大数字和。文章详细介绍了如何利用 dp 数组存储中间结果,并通过两层循环迭代求解最优路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:hdu-1087

题意:从起点到终点,走的值必须必前面走的值大,求到终点的时候走过的路上数字的最大和

思路:dp[i]存到当前点切以当前点为最后一步的最优解,1~n之间肯定有一个点是最后一个点,或者直接到终点,则依次把1~n当做最后一个点,求出最优解就行,最优解即为dp[i]中最大的数,这是第一层循环,第二层循环就是1~i;把j当做i项前面的最后一项,求出最优的dp[i],从n个dp[i]中选取最大的,即为最后的结果

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	//dp[i]表示以i点为走过的最后一点的时候的最优解 
	int n, i, j, k, t, l, m, dp[1005], max1, s[1005];
	while (cin >> n, n)
	{
		for (i = 1; i <= n; i++)
			cin >> s[i];
		dp[0] = 0;//起点初始化为0 
		s[0] = 0;
		max1 = 0;//记录所有dp[i]的最大值 
		for (i = 1; i <= n; i++)
		{
			 t = 0;//临时变量,最后存的是dp[i]的最优解 
              for (j = 0; j < i; j++)
			  {
				  if (s[j] < s[i])t = max(t, dp[j] + s[i]);//当s[j]符合要求时,更新t; 
			  }
			  dp[i] = t;//t保存的是dp[i]的最优解 
			  max1 = max(dp[i], max1);//n个dp[i]的最大值 
		}
		cout << max1 << endl;
			
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值