hdu1087 dp(最大上升子序列和)

题意,给出一列数,要求所有上升子序列中序列和最大的。

这回不是求长度了,但是还是相当基础的 dp 水题,只要用 dp [ q ] 记录以 第 q 个数 a [ q ] 为结尾的上升子序列的最大的和就可以了

对于 q ,初始化 dp [ q ] = a [ q ] ,从最前面到 q 遍历,若有第 i 个数 a [ i ] < a [ q ] ,则 dp [ q ] = max ( dp [ q ] , dp [ i ] + a [ q ] );

这样 dp 一遍并同时记录下最大值,就可以直接输出结果了

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define max(a,b) a>b?a:b
 4
 5 int a[1002];
 6 long long dp[1002];
 7
 8 int main(){
 9     int n;
10     while(scanf("%d",&n)!=EOF&&n!=0){
11         int q,i,j;
12         long long m=0;
13         for(q=1;q<=n;q++){
14             scanf("%d",&a[q]);
15             dp[q]=a[q];
16             for(i=1;i<q;i++){
17                 if(a[i]<a[q]){
18                     dp[q]=max(dp[q],dp[i]+a[q]);
19                 }
20             }
21             m=max(m,dp[q]);
22         }
23         printf("%I64d\n",m);
24     }
25     return 0;
26 }

时间: 2024-10-11 07:44:11

hdu1087 dp(最大上升子序列和)的相关文章

hdu1087最长递增子序列

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

dp --- 最大上升子序列

<传送门> [题目大意] 首先给你一个数n,然后给你n个数,现在要你从这n个数字中找一个上升子序列使得这些子序列的和最大. [题目分析] 简单dp,求最大上升子序列. 首先我们得设两个数组a[1010]和dp[1010].a[1010]存放输入的数列,dp[1010]用来存放从开始到当前的最大上升子序列: 状态转移方程为:  dp[i]=a[i]+max(dp[j]&&a[j]<a[i]&&0<=j<i); 代码很简单: #include<

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!

(hdu step 3.2.1)Max Sum(简单dp:求最大子序列和、起点、终点)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1390 Accepted Submission(s): 542   Problem Descrip

动态规划(dp)----公共子序列(LCS) 问题进一步理解

相对于上一篇 初级 ,这道题稍加深难度,下面这题,比上面多了一个最长子序列的输出,测试一下理解程度,逆序过程 51nod1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的) 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个. Input示例

动态规划专题(一) 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个

1925: [Sdoi2010]地精部落 dp, 抖动子序列

看到这道题第一反应就把该题与白书的一道例题联系起来了.(虽然后来证明两者并没有联系.)因此我一开始的思路就是从n到1一个个加进去.虽然的确搞不太出来. 然后开始膜题解了.………………………………好可耻啊! 首先可以证明.一个开头下降的抖动子序列 1~n 可以通过 n - xi + 1 (xi 为 第i位的值 )的形式变为一个上升的. 然后就利用这个性质搞了 设 f[i][j] 为长度为 i , 分别以 1~j 开头且开头上升(如果你要问我为什么是上升的你可以自己推一下,反正我推不出来.)的方案数

hdu 1087 Super Jumping! Jumping! Jumping!(dp:上升子序列最大和)

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

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

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