题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087

题目本质上要求我们求给定序列的最长的递增序列,由于刚接触DP,所以一开始还把状态方程写错了,还特地看了运筹学和算法导论的动态规划这一部分。以下是错误的解题历程,读者可以忽略这部分“【 】”。

【(sum[i]保存的是当前求得的最大和, d[i]保存的是第i个数,sum[i] = max{sum[i-1], sum[i-1]+d[i]}  条件是: d[i-1] > d[i])。接着写成:sum[i] = sum[i-1]+d[i]  (d[i-1] < d[i]) (注意:这里的d[i-1]不一定紧挨着d[i]的,它表示的是计算前一个最大和状态sum[i-1]时的最后一个数,即为d[i-1],那么当前的最大和sum[i]在满足d[i-1] < d[i]这种情况的时候,只能是sum[i-1]+d[i]了

比如说这个序列 :   1   5   4   98   7   46   3 
当i指示的是4这个数时,前一个最大和状态sum[i-1]为 6(1+5的结果,此时d[i-1]为5),但当前的d[i]为4,显然不满足d[i-1] < d[i],于是i指向下一个位置,即98这个数,满足d[i-1] < d[i](5 < 98),于是更新新一轮的sum[i],为104(6+98),i继续向后移动,由于再也找不到比98大的数,所以最终结果是104。如果不满足d[i] > d[i-1],那么就一直保存前一个状态s[i-1],直到扫描到序列的最后一个元素。如果这样想,有一种序列是求解不了的,即1 9 4 8 98 110,我写的代码里只能求解1 9 98 110, 不能求解更大的1 4 8 98 110】,无奈之下,看了别人的思路,再加上做01背包(bone collector)的经验,一下子顿悟了。

正确的状态转移方程:  sum[i] = max{sum[j]} + d[i] (0 <= j < i && d[j] < d[i])

要多设一个辅助数组是sum[i],它的数组下标是和d[i]的数组下标是一致的。保存的是比当前i小的且排在i前面的最大和,例如选定的dp[3] (98),它可以选的点是下标为  0、 1、 2 的sum值,此时我们是选最大的sum[1](前提是dp[1] < dp[3]),那么加上当前的dp[3],sum[3] = sum[1] + dp[3]了。这里的阶段实质上是如何得到sum[i],而它是与当前的dp[i]和sum[j](j < i)密切相关的。最后再比较sum[i]里的数,最大的那个数即是结果。

假设还是       1    5     4     98     7      46    3  这个序列

数组下标i      0    1     2     3      4      5     6

dp[i]          1    5     4     98     7      46    3

sum[i]         1    6     5     104    13     59    4

 1 #include <iostream>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     int dp[1005], sum[1005], i, j, n, maxsum, msum;
 7     while (cin >> n && n)
 8     {
 9         memset(sum, 0, sizeof(sum));
10         for (i = 0;  i < n; i++)
11             scanf("%d", &dp[i]);
12         sum[0] = dp[0];
13         for (i = 1; i < n; i++)
14         {
15             msum = 0;
16             for (j = i-1; j >= 0; j--)
17             {
18                 if (msum < sum[j] && dp[i] > dp[j])
19                 {
20                     msum = sum[j];
21                 }
22             }
23             sum[i] = msum + dp[i];
24         }
25         maxsum = sum[0];
26         for (i = 1; i < n; i++)
27             if (maxsum < sum[i])
28                 maxsum = sum[i];
29         printf("%d\n", maxsum);
30     }
31     return 0;
32 }

转载于:https://www.cnblogs.com/windysai/archive/2013/05/30/3109428.html

hdu 1087 Super Jumping! Jumping! Jumping! 解题报告相关推荐

  1. hdu 1087 Super Jumping! Jumping! Jumping! 动态规划

    Super Jumping! Jumping! Jumping! Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K ...

  2. hdu 1087 Super Jumping! Jumping! Jumping!

    Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!" is very popular i ...

  3. DP专题训练之HDU 1087 Super Jumping!

    Description Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!" is ve ...

  4. hdu 1087 Super Jumping! Jumping! Jumping!

    Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!" is very popular i ...

  5. HDU 1087 Super Jumping! Jumping! Jumping!【最大递增子段和】

    Problem Description Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!&quo ...

  6. 最长上升子序列模板 hdu 1087 Super Jumping! Jumping! Jumping!

    Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!" is very popular i ...

  7. hdu - 1087 - Super Jumping! Jumping! Jumping!

    题意:求最大升序和. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 -->>设d[i]表示以第i个数为终点的最大升序和,然后从第1 ...

  8. HDU 1087 [Super Jumping! Jumping! Jumping!]动态规划

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 题目大意:有N个格子,每个格子有数值.从原点开始跳,可以跳到任何一个位置:在某一个位置,只能跳到 ...

  9. HDU 1087 Super Jumping! Jumping! Jumping! (最长上升子序列的变形,子序列值最大)

    题意 wsw获得了与小姐姐约会的机会,同时也不用担心wls会发现了,可是如何选择和哪些小姐姐约会呢?wsw希望自己可以循序渐进,同时希望挑战自己的极限,我们假定每个小姐姐有一个"攻略难度值& ...

  10. hdu 2013 蟠桃记-递推-[解题报告]C++

    蟠桃记 问题描述 : 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题! 什么问题?他研究的问题是蟠桃一共有多少个! 不过,到最 ...

最新文章

  1. c语言 打开文件夹空格,关于文件操作,碰到空格就换行
  2. 用源码轻松搭建LNMP !
  3. 计算机基础课教学心得,计算机基础教学心得
  4. 查看linux中某个端口(port)是否被占用
  5. spring源码分析之spring-core asm概述
  6. springboot设置欢迎页
  7. 不会Object.defineProperty你就out了
  8. angularjs 上传
  9. 找回VisualStudio异常设置中丢失的“用户未处理的(User-unhandled)”列
  10. webservice系统学习笔记8-简单的权限校验
  11. hadoop之 hadoop日志存放路径
  12. Tableau商业智能与可视化应用实战系列视频教程(史上最全)
  13. 键盘之王——求打字峰值速率的小程序(C语言)
  14. python求图形面积_如何使用python语言中的if语句实现求取图形面积
  15. 【LeetCode刷题笔记-87 42:接雨水(三解法)】
  16. WinX DVD Ripper for Mac(DVD视频格式转换工具)
  17. 内网穿透 natApp
  18. 【Proteus仿真】【STM32单片机】比赛计时计分系统设计
  19. 彻底关闭WinRAR广告弹窗
  20. 接口(基本接口和函数式接口)

热门文章

  1. 【网络】半双工和全双工
  2. [转]——软件开发人员如何成长
  3. 【博客搬家】【转】matlab 6.5和7.0中simulink模型的兼容问题
  4. 获取iframe子页面节点,响应浏览器宽高
  5. arguments.callee 指向正在执行的函数的指针
  6. 训练赛20160403
  7. windows 服务的安装与卸载之bat脚本命令
  8. Ubuntu安装Apache+PHP
  9. Oracle服务的作用
  10. iOS 实现搜索关键字高亮