(step3.2.2)hdu 1087(Super Jumping! Jumping! Jumping!——简单DP)

本文介绍了一种求解最长上升子序列最大和值的方法,通过动态规划的方式,使用f[i]=max(f[i],f[j]+a[i])的状态转移方程进行求解。

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

题目大意:求上升子序列的最大和值(注意这里求的是最长上升子序列)


解题思路:

1)状态转移方程:f[i] = max(f[i], f[j] + a[i]);

2)具体实现过程这样来,首先记录下N个数  a[] 数组,对于每个数开辟一个 f[] 数组,用来记录到达该数值时的最大和值,f[]数组很重要,因为它能够对解决后面的问题提供信息,记录局部的最有解


3)需要注意的是:本体求的是上升子序列的最大和值而不是连续上升子序列的最大和值。如

对于测试数据4 1 3 2 4 ,输出的应该是8,而不是6


代码如下:

 

/*
 * 1087_2.cpp
 *
 *  Created on: 2013年8月13日
 *      Author: Administrator
 */

#include <stdio.h>
#include <string.h>
#include <algorithm>

int max(int a, int b) {
	return a > b ? a : b;
}
int f[1010];
int a[1010];

/**
 * a[]: 保存的是输入的每一个数
 * f[] :用来记录到达该记录时的最大和值.
 * maxs :保存全局最大和值
 */
int main() {

	int n;
	while (scanf("%d", &n) != EOF, n) {
		memset(f, 0, sizeof(f));

		int i, j;
		for (i = 1; i <= n; ++i) {
			scanf("%d", &a[i]);
			f[i] = a[i];//一开始用来记录第i个数.后来用来记录到达第i个数时的最大和值
		}

		int maxs = f[1];
		for (i = 2; i <= n; ++i) {
			for (j = 1; j < i; ++j) {
				if (a[i] > a[j]) {
					f[i] = max(f[i], f[j] + a[i]);
					maxs = max(maxs, f[i]);
				}
			}
		}

		printf("%d\n", maxs);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值