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! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little about this game, so I introduce it to you now.

The game can be played by two or more than two players. It consists of a chessboard(棋盘)and some chessmen(棋子), and all chessmen are marked by a positive integer or “start” or “end”. The player starts from start-point and must jumps into end-point finally. In the course of jumping, the player will visit the chessmen in the path, but everyone must jumps from one chessman to another absolutely bigger (you can assume start-point is a minimum and end-point is a maximum.). And all players cannot go backwards. One jumping can go from a chessman to next, also can go across many chessmen, and even you can straightly get to end-point from start-point. Of course you get zero point in this situation. A player is a winner if and only if he can get a bigger score according to his jumping solution. Note that your score comes from the sum of value on the chessmen in you jumping path.
Your task is to output the maximum value according to the given chessmen list.

Input

Input contains multiple test cases. Each test case is described in a line as follow:
N value_1 value_2 …value_N 
It is guarantied that N is not more than 1000 and all value_i are in the range of 32-int.
A test case starting with 0 terminates the input and this test case is not to be processed.

Output

For each case, print the maximum according to rules, and one line one case.

Sample Input

3 1 3 2

4 1 2 3 4

4 3 3 2 1

0

Sample Output

4

10

3

最长上升子序列,数据小,n2做法

 1 //2016.10.7
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6
 7 using namespace std;
 8 const int N = 1005;
 9 long long arr[N], dp[N];
10
11 int main()
12 {
13     int n;
14     long long ans;
15     while(scanf("%d", &n)!=EOF && n)
16     {
17         ans = 0;
18         for(int i = 0; i < n; i++)
19               scanf("%lld", &arr[i]);
20         memset(dp, 0, sizeof(dp));
21         for(int i = 0; i < n; i++)
22         {
23             dp[i] = arr[i];
24             for(int j = 0; j < i; j++)
25                   if(arr[i] > arr[j])
26                       dp[i] = max(dp[i], dp[j]+arr[i]);//状态转移方程
27             ans = max(ans, dp[i]);
28         }
29         printf("%lld\n", ans);
30     }
31
32     return 0;
33 }
时间: 2024-10-26 04:11:08

HDU1087(dp)的相关文章

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 一遍并同时记录下最大值,就可以直接输出结

HDU1087 Super Jumping! Jumping! Jumping!(简单dp)

题意:只能走比当前旗子大的旗子,不能回头,求走过最大的旗子的和. /* *********************************************** Author :devil Created Time :2015/12/21 20:58:22 ************************************************ */ #include <iostream> #include <algorithm> #include <cstri

hdu1087 简单DP

I - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HD

HDU1087:Super Jumping! Jumping! Jumping!(简单dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1087 水题,可是我却因为dp数组的初始化造成了多遍wa,这题就是求上升序列的最大和. 转移方程: 首先要对dp初始化. if(w[i]>w[j]) dp[i]=dp[j]+w[i];i>j #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #in

HDU1087 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): 22510    Accepted Submission(s): 9907 Problem Description Nowadays, a kind of chess game called "Super Jumping!

单行dp复习hdu1087

我写的想法是每一个dp[i]都是前dp[i]的最大值 dp[i]就等于前所有dp[0...i-1]的最大值加上dp[i] 最大值是一个中间变量 最大值得选取条件就是序列的值大小都是递增的,也就是a[i]>a[前面的] #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; LL a[1000+100]; LL dp[1100]

[HDU1087]Super Jumping! Jumping! Jumping!&lt;dp&gt;

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 题目大意: 多组数据,一个n和一个n个元素的序列,找到和最大的严格上升子序列 思路: 和严格上升序列有点像,不过dp数组dp[i]变成以i为结尾的序列的最大值. 就是需要对于每一个i维护一个小于这个元素的之前元素的最大严格上升子序列. 只上核心代码 int main(){ while(scanf("%d",&n)!=EOF){ if(n==0)return 0; for(in

hdu1087最长递增子序列

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

HDU 1087 &amp;&amp; POJ 2533(DP,最长上升子序列).

~~~~ 两道题的意思差不多,HDU上是求最长上升子序列的和,而POJ上就的是其长度. 貌似还有用二分写的nlogn的算法,不过这俩题n^2就可以过嘛.. ~~~~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 http://poj.org/problem?id=2533 ~~~~ HDU1087: #include<cstdio> #include<cstring> #include<algorithm> #