解法一

此题是一个简单的动态规划问题,用dp[i]记做最后一步经过第i个数所得到的最大sum值,则结果=max(dp[i]),i=1,...n.考虑dp[i]的前一步会经过那里?假设dp[i]的前一步经过第j个数,则子问题dp[j]满足最优子结构。dp[i]=a[i]+max(dp[j]) .(a[j]<a[i]);

/*---dp[i]表示最后一步经过第i个数
----转移方程dp[i]=a[i]+max(dp[j])(a[j]<a[i],j<i)
*/
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 1000 + 10;
LL dp[MAXN];
int a[MAXN];
int main(){
int n, i, j;
while (scanf("%d", &n) && n){
for (i = 1; i <=n; i++)
scanf("%d", &a[i]);
memset(dp,0, sizeof(dp));
dp[1] = a[1];
LL ans =dp[1];
for (i = 2; i <= n; i++){
dp[i] = a[i];
for (j = 1; j < i; j++){
if (a[j]<a[i])
dp[i] = max(dp[i], dp[j]+a[i]);
}
ans = max(ans, dp[i]);
}
printf("%I64d\n", ans);
}
return 0;
}

  解法二  转化为GAD模型

考虑若i<j,同时选择a[i]和a[j]的合法条件是a[i]<a[j].于是在数组中寻找满足i<j且a[i]<a[j],将i向j连接一条有向边。用dp[i]表示从i出发可以得到的最大和,则有:

dp[i]=a[i]+max(dp[j]) .j是i的邻接点。采用记忆化搜索来求解。

/*---DAG模型求解
----若序列中a[i]<a[j](i<j)则从i到j连接一条有向边
*/
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 1000 + 10;
LL dp[MAXN];
int a[MAXN];
vector<int>vec[MAXN];
//记忆化搜索
LL dfs(int i){
LL &ans = dp[i];
if (ans >= 0)
return ans;
ans = 0;
for (int j = 0; j < (int)vec[i].size(); j++){
ans = max(ans,dfs(vec[i][j]));
}
return ans=ans + a[i];
}
int main(){
int n, i,j;
while (scanf("%d", &n) && n){
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (i = 0; i < n; i++){
vec[i].clear();
for (j = i + 1; j < n; j++){
if (a[j]>a[i])
vec[i].push_back(j); //i到j有向边
}
}
LL ans = 0;
memset(dp, -1, sizeof(dp));
for (i = 0; i < n; i++){
if (dp[i]<0)
dp[i] = dfs(i);
ans = max(ans, dp[i]);
}
printf("%I64d\n", ans);
}
return 0;
}

  

HDU1087上升子序列的最大和的更多相关文章

  1. 杭电1003 Max Sum 【连续子序列求最大和】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目意思: 即给出一串数据,求连续的子序列的最大和 解题思路: 因为我们很容易想到用一个max ...

  2. 连续子序列的最大和 牛客网 剑指Offer

    连续子序列的最大和 牛客网 剑指Offer 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量 ...

  3. 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和

    这段时间笔者几篇文章介绍了改算法线性的文章. 关联文章的地址 这个算法我在我的博客里应用动态规划做过,详细实现请参阅我的dp板块,下面给出书上最快的算法,时间复杂度为O(n),称之为线性算法. #in ...

  4. [GRYZ2014]递增子序列最大和

    [问题描述] 给定长度为n的正整数序列a1,a2,…,an. 求一个递增的子序列,和最大. [输入] 第一行,n,表示给定序列的个数. 第二行,n个用空格隔开的正整数. [输出] 递增子序列的最大和. ...

  5. 连续子序列最大和的O(NlogN)算法

    对于一个数组,例如:int[] a = {4,-3,5,-2,-1,2,6,-2}找出一个连续子序列,对于任意的i和j,使得a[i]+a[i+1]+a[i+2]+.......+a[j]他的和是所有子 ...

  6. hdu1087 dp

    题意:给定一串数字,要求选取一个严格递增的子序列,使序列和最大. dp[i] 表示以 i 为结尾的子序列的最大和,dp[i] = max{dp[j]+a[i]}(j 从 0 到 i-1),dp[0]是 ...

  7. HDU 1087 Super Jumping! Jumping! Jumping! --- DP入门之最大递增子序列

    DP基础题 DP[i]表示以a[i]结尾所能得到的最大值 但是a[n-1]不一定是整个序列能得到的最大值 #include <bits/stdc++.h> using namespace ...

  8. HDU 1087 简单dp,求递增子序列使和最大

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

  9. HDU 1003 Max Sum【动态规划求最大子序列和详解 】

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

随机推荐

  1. day02_05.除数与被除数

    第5题 除数与被除数 编程需要一定数学能力,在这看看你找到了几个有用条件, 又该如何来运用他们呢? 学习是互通的 题目:两个自然数相除,商3余10,被除数,除数,商,余数的和是163,求被除数,除数. ...

  2. github 上传项目

    注册账户以及创建仓库 要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之 ...

  3. SDRAM学习(二)之初始化

    目录 1.SDRAM初始化的内容(结合英文数据手册) 2.SDRAM初始化的时序 3.代码的编写 4.modesim的仿真 SDRAM初始化的内容 SDRAMs must be powered up ...

  4. 集训队日常训练20181110 DIV2 题解及AC代码

    4375: 孪生素数  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 324       ...

  5. hihoCoder #1783 又一个重复计数

    题目大意 给定一个长度为 $n$ 的字符串 $S$,定义函数 $f(S)$ 表示 $S$ 的不同回文子串的个数.对于 $1\le l \le r \le n$,定义 $S[l,r]$ 为字符串 $S$ ...

  6. 十一黄(xun)金(lian)周感想

    实际上并没有训整整一周-_-|| 只训了三天 听说纪中全员没过节(ΩДΩ)好可怕 这三天考了5场模拟赛,一场初赛模拟 让我感觉我和开学时比起来还是有很大的提升的 最主要就是在dp方面. 经过整个九月疯 ...

  7. hdu 1503 最长公共子序列

    /* 给两个串a,b.输出一个最短的串(含等于a的子序列且含等于b的子序列) */ #include <iostream> #include <cstdio> #include ...

  8. 星际转移(cogs 736)

    «问题描述: 由于人类对自然资源的消耗,人们意识到大约在2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177 年冬由于未知的原因,地球环境发生 ...

  9. sql2008游标FORWARD_ONLY STATIC 的使用方式

    CREATE TABLE #xms_staff_department ( id int, name varchar(128), parent_id int, parent_path varchar(5 ...

  10. BZOJ【1639】: [Usaco2007 Mar]Monthly Expense 月度开支

    1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 700  Solved: ...