HDU1087上升子序列的最大和
解法一
此题是一个简单的动态规划问题,用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上升子序列的最大和的更多相关文章
- 杭电1003 Max Sum 【连续子序列求最大和】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目意思: 即给出一串数据,求连续的子序列的最大和 解题思路: 因为我们很容易想到用一个max ...
- 连续子序列的最大和 牛客网 剑指Offer
连续子序列的最大和 牛客网 剑指Offer 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量 ...
- 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
这段时间笔者几篇文章介绍了改算法线性的文章. 关联文章的地址 这个算法我在我的博客里应用动态规划做过,详细实现请参阅我的dp板块,下面给出书上最快的算法,时间复杂度为O(n),称之为线性算法. #in ...
- [GRYZ2014]递增子序列最大和
[问题描述] 给定长度为n的正整数序列a1,a2,…,an. 求一个递增的子序列,和最大. [输入] 第一行,n,表示给定序列的个数. 第二行,n个用空格隔开的正整数. [输出] 递增子序列的最大和. ...
- 连续子序列最大和的O(NlogN)算法
对于一个数组,例如:int[] a = {4,-3,5,-2,-1,2,6,-2}找出一个连续子序列,对于任意的i和j,使得a[i]+a[i+1]+a[i+2]+.......+a[j]他的和是所有子 ...
- hdu1087 dp
题意:给定一串数字,要求选取一个严格递增的子序列,使序列和最大. dp[i] 表示以 i 为结尾的子序列的最大和,dp[i] = max{dp[j]+a[i]}(j 从 0 到 i-1),dp[0]是 ...
- HDU 1087 Super Jumping! Jumping! Jumping! --- DP入门之最大递增子序列
DP基础题 DP[i]表示以a[i]结尾所能得到的最大值 但是a[n-1]不一定是整个序列能得到的最大值 #include <bits/stdc++.h> using namespace ...
- HDU 1087 简单dp,求递增子序列使和最大
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
随机推荐
- 42、通过ontouch检测expandableListview的单击、长按、列表滚动
一.在model定义变量: public boolean isExpandableListviewScroll = false;//这个是 首先监听expandableListview的滚动: Exp ...
- 如何过滤adb logcat输出
简介: 本文介绍如何在 shell 命令行中过滤 adb logcat 输出的几个小技巧. 开发当中经常看到别人的 log 如洪水般瞬间刷满了屏幕,对自己有用的信息都被淹没了,影响心情也影响效率.下面 ...
- 基础概念:Oracle数据库
基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库:Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库的 ...
- 通过TCP实现文件传输
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.In ...
- 2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)
问题 I: qwb VS 去污棒 时间限制: 2 Sec 内存限制: 256 MB 提交: 74 解决: 26 [提交][状态][讨论版] 题目描述 qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底 ...
- Codeforces Round #364 (Div. 2) B 标记
B. Cells Not Under Attack time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- python(6)-- 模块
python模块: 定义:Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 作用:(a) 模块让你能够有逻辑地组织你 ...
- JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链、闭包解析)
1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = fu ...
- 序列操作(bzoj 1858)
Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 ...
- EnableViewState 属性
原文发布时间为:2009-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 指示是否在页请求之间保持视图状态。如果要保持视图状态,则为 true;否则为 false。默认值为 true。 自 ...