您的位置:首页 > 其它

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

2013-08-13 20:39 501 查看
题目大意:求上升子序列的最大和值(注意这里求的是最长上升子序列)

解题思路:

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: