HDU 1087

  题目大意:给定一个序列,只能走比当前位置大的位置,不可回头,求能得到的和的最大值。(其实就是求最大上升(可不连续)子序列和)

  解题思路:可以定义状态dp[i]表示以a[i]为结尾的上升子序列的和的最大值,那么便可以得到状态转移方程

       dp[i] = max(dp[i], dp[j]+a[i]), 其中a[j]<a[i]且j<i;  另外每个dp[i]可以先初始化为a[i]

       理解:以a[i]为结尾的上升子序列可以由前面比a[i]小的某个序列加上a[i]来取得,故此有dp[j]+a[i], j < i, a[j] < a[i]三个条件

          若是前面没有比a[i]小的序列,那么dp[i]为a[i]本身,故此有dp[i]全初始化为a[i]。

          最后获取dp[i]数组中的最大值就是最终结果了。

/* HDU 1087 Super Jumping! Jumping! Jumping! --- dp */
#include <cstdio>
#include <cstring> int a[];
int dp[]; inline int MAX(int a, int b){
return a > b ? a : b;
} int main()
{
#ifdef _LOCAL
freopen("D:input.txt", "r", stdin);
#endif int n; while (scanf("%d", &n) == && n){ for (int i = ; i <= n; ++i){
scanf("%d", a + i); //获取n个数
dp[i] = a[i]; //dp[i]的初始化
}//for(i) //dp[i] = max(dp[i], dp[j]+a[i]), 其中a[j] < a[i]
int maxnum = dp[]; //max保存最终结果
for (int i = ; i <= n; ++i){
for (int j = ; j <= i; ++j){
if (a[j] < a[i]){
dp[i] = MAX(dp[i], dp[j] + a[i]);
if (dp[i] > maxnum){
maxnum = dp[i];
}
}
}//for(j)
}//for(i)
printf("%d\n", maxnum);
} return ;
}

HDU 1087 Super Jumping! Jumping! Jumping的更多相关文章

  1. HDU 1087 Super Jumping! Jumping! Jumping!(求LSI序列元素的和,改一下LIS转移方程)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limit: 20 ...

  2. hdu 1087 Super Jumping! Jumping! Jumping!(动态规划DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limit: 200 ...

  3. HDU 1087 Super Jumping! Jumping! Jumping! 最长递增子序列(求可能的递增序列的和的最大值) *

    Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64 ...

  4. hdu 1087 Super Jumping! Jumping! Jumping!(dp 最长上升子序列和)

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

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

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

  6. hdu 1087 Super Jumping! Jumping! Jumping! 简单的dp

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. HDU 1087 Super Jumping! Jumping! Jumping! 最大递增子序列

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. HDU 1087 Super Jumping! Jumping! Jumping! (DP)

    C - Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  9. HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)

    Super Jumping! Jumping! Jumping! Problem Description Nowadays, a kind of chess game called “Super Ju ...

随机推荐

  1. Linux-C程序的存储空间布局

    正文段 指的是由CPU执行的机器代码,通常,正文段是可以共享的,执行的程序在存储器中只有一个副本.通常也是只读的,防止程序本身被修改. 初始化数据段 数据段,被明确赋值的变量,比如全局变量 非初始化数 ...

  2. lucas 定理学习

    大致意思就是求组合数C(n , m) % p的值, p为一个偶数 可以将组合数的n 和 m都理解为 p 进制的表示 n  = ak*p^k + a(k-1)*p^(k-1) + ... + a1*p ...

  3. Codeforces Round #326 (Div. 2)-Duff in Love

    题意: 一个数x被定义为lovely number需要满足这样的条件:不存在一个数a(a>1),使得a的完全平方是x的因子(即x % a2  != 0). 给你一个数n,求出n的因子中为love ...

  4. 由于lightdm.conf 错误无法进入ubuntu 的办法

    由于自己向默认登录GNOME桌面,所以修改了lightdm,由于参数错误,结果无法启动桌面? 这是需要进入shell界面: 1.选择cancel ,如果虚拟机下无法点击cancel按钮,可以使用快捷键 ...

  5. 通过使用ScriptManager.RegisterStartupScript,呈现后台多次使用alert方法

    在前台HTML中加入alert或者confirm,相信大家已经非常熟悉并且经常使用: <div onclick="alert('hello')">按钮1</div ...

  6. [流媒体]live555简介(转)

    live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现 了对多种音视频编码 ...

  7. 乌龟棋(noip2010)

    分析:该题是经典的动态规划题目. 题目中涉及到卡片数.卡片分4类.格子数等若干信息,又每张卡片仅能使用一次.求到达终点最多能能获得多少分. 从题目中可知卡片的使用顺序影响最终得分,我们可知状态转移和使 ...

  8. poj1160 dp

    //Accepted 564 KB 63 ms //和hdu1227一样 //dp[i][j]=min(dp[i][j],dp[k][j-1]+cost[k+1][i]) //初始化条件,dp[0][ ...

  9. mycat启动后,用Navicat Premium 连接报 "2013"

    最近在学习mycat,启动后,用Navicat Premium 连接报 "2013"  Lost Connection During Query ,经过一顿百度也没发现是怎么回事, ...

  10. select multiple images in Android Gallery

    http://stackoverflow.com/questions/18520976/all-properties-of-intent-putextra-to-crop-image-in-andro ...