HDU1087

这是一个典型的动态规划问题。由于是动态规划新手,起初的时候没有划分好子问题,导致有的测试结果一直wa.

对于数据a[1...n],可以分为n个子问题,我们思考最后一步经过哪里?于是又n中可能,最后一步可能经过a1.a2...an,用m[i]表示最后一步经过a[i]可以获得的最大的值,那么m[i]怎么表示?我们可以考虑倒数第二步,于是有递推公式:m[i]=max{a[i]+m[k]}(其中a[i]>a[k],0<k<i),于是求解最大序列可以表示为:

sum=max{m[k]}(其中0<k<=i)

对于这个递归方程解释为:先求解最后一次经过a[i]的m[i],然后搜索m[1...i]的最大值即为sum的值

#include<iostream>
#include<cmath>
using namespace std;
_int64 MaxJump(_int64 a[], int n);
int main(){
int i, n;
_int64 a[1001];
while (cin >> n&&n){
for (i =1; i<=n; i++)
cin >> a[i];
cout << MaxJump(a, n) << endl;
}
return 0;
}
_int64 MaxJump(_int64 a[], int n){
_int64 i,j,max=a[1];
_int64 m[1001];
m[0] = 0, m[1] = a[1];
for (i = 2; i <= n; i++){
/*先解决m[i]*/
m[i] =a[i];
for (j = 1; j < i; j++){
if (a[i]>a[j] && m[i] < m[j] + a[i])
m[i] = m[j] + a[i];
}
}
for (i = 1; i <= n;i++)
if (max < m[i])
max = m[i]; //求解m[1...n]最大值
return max;
}

时间: 2024-11-06 08:00:55

HDU1087的相关文章

hdu1087最长递增子序列

原题地址 简单dp题,LIS.不同之处是这里要求得的不是最长的子序列,而是权重和最长的子序列.其实大同小异. 状态数组就是到达每个位置的最大权重. LIS问题常用解法就是两个: 人人为我 我为人人 本题我用了我为人人的思路 .就是确定子序列起点,把其后面每一个大于它的值的位置的状态数组更新. #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using name

HDU1087(dp)

Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34286    Accepted Submission(s): 15555 Problem Description Nowadays, a kind of chess game called “Super Jumping!

hdu1087 最大递增子段和

http://acm.split.hdu.edu.cn/showproblem.php?pid=1087 状态方程:sum[j]=max{sum[i]}+a[j]; 其中,0<=i<=j,a[i]<a[j] 把当前最大和更新到数组中,注意顺序. Input Input contains multiple test cases. Each test case is described in a line as follow:N value_1 value_2 …value_N It is

动态规划专题(一) HDU1087 最长公共子序列

Super Jumping! Jumping! Jumping! 首先对于动态规划问题要找出其子问题,如果找的子问题是前n个序列的最长上升子序列,但这样的子问题不好,因为它不具备无后效性,因为它的第n+1的数会影响前n个序列的长度,换句话说,如果第n+1个数加上去不一定使得和前n个数加起来就是最长子序列,具体例子很多比如5,6,1,2 第5个数是3,那么最长序列5,6加3不会比1,2加3长. 比较好的子问题是“求以第K个为终点的最长上升子序列”,其实这个子问题的好处在于它限定了一点,终点为第k个

解题报告 HDU1087 Super Jumping! Jumping! Jumping!

Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a

HDU1087 Super Jumping! Jumping! Jumping!(简单dp)

题意:只能走比当前旗子大的旗子,不能回头,求走过最大的旗子的和. /* *********************************************** Author :devil Created Time :2015/12/21 20:58:22 ************************************************ */ #include <iostream> #include <algorithm> #include <cstri

hdu1087 简单DP

I - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HD

HDU1087:Super Jumping! Jumping! Jumping!(简单dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1087 水题,可是我却因为dp数组的初始化造成了多遍wa,这题就是求上升序列的最大和. 转移方程: 首先要对dp初始化. if(w[i]>w[j]) dp[i]=dp[j]+w[i];i>j #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #in

暑假集训(5)第一弹——— Super Jumping! Jumping! Jumping!(hdu1087)

题意概括:在上次与娑殚的三次博弈中,你们都取得了胜利.便向娑殚提出要求,借助他的力量,传送到一个安全的地方. 你们的愿望达成了,不过,你和小A似乎失散了. 街上人来人往的特别热闹,每一个人的脸上都洋溢着幸福.“咕咕......"额,掏了掏身上的口袋,除你之外. “听说了嘛,德源街哪有个脑力比赛,据说优胜者可以去”吃到饱“饭店吃到饱,而且前三名还会有神秘奖品......" 这次,为了填饱......嗯,为了生存,你决定参加这个比赛,比赛要求你得到在给定的数字中得到最大循序上升序列和. 问

HDU1087 Super Jumping! Jumping! Jumping! 最大连续递增子段

Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32561    Accepted Submission(s): 14689 Problem Description Nowadays, a kind of chess game called “Super Jumping!