zoukankan      html  css  js  c++  java
  • Super Jumping! Jumping! Jumping(最大递增子序列的和)

    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.

    InputInput 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.
    OutputFor 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
    题意:在start->end这条路上有多个棋手,每个棋手都有一个价值,如果你想获得某个棋手的价值则该棋手的价值必须比上一个获得的棋手的价值大,求在这条路线上你能获得的最大价值
    分析:从题面上来看,是让我们求最大递增子序列的和。如果我们要求前k项max(lIs),那我们可以从前k项遍历,如果str[j]<str[k],则dp[k]=max(dp[k],dp[j]+str[k]),反之我们不更新。
    dp[i]表示前i项最大递增子序列的和

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<stack>
     5 #include<queue>
     6 #include<iostream>
     7 #include<map>
     8 #include<vector>
     9 #define Inf 0x3f3f3f3f
    10 #define PI acos(-1.0)
    11 using namespace std;
    12 int dp[1234];
    13 int str[1234];
    14 int main()
    15 {
    16     int m,n,i,j,pos;
    17     while(scanf("%d",&m)!=-1&&m)
    18     {
    19     for(i=1; i<=m; i++)
    20     {
    21         scanf("%d",&str[i]);
    22     }
    23      memset(dp,0,sizeof(dp));
    24      int ans=-Inf;
    25     for(i=1;i<=m;i++)
    26     {
    27         dp[i]=str[i];
    28         for(j=1;j<=i;j++)
    29         {
    30             if(str[j]<str[i])
    31             {
    32                 dp[i]=max(dp[i],dp[j]+str[i]);
    33             }
    34         }
    35         ans=max(ans,dp[i]);
    36 
    37     }
    38     cout<<ans<<endl;
    39     }
    40     return 0;
    41 }
    View Code
    我们会发现对与前n项的max(LIS),都有这个重叠子问题,因此
    我们构造状态转移方程dp[k]=max(dp[k],dp[j]+str[k])


  • 相关阅读:
    Fragment之三:根据屏幕尺寸加载不同的Fragment 分类: H1_ANDROID 2013-11-15 21:37 1162人阅读 评论(0) 收藏
    Fragment之一:Fragment入门 分类: H1_ANDROID 2013-11-15 18:16 2799人阅读 评论(2) 收藏
    Github android客户端源代码分析之一:环境搭建 分类: H1_ANDROID 2013-11-12 22:47 2829人阅读 评论(0) 收藏
    《30天自制操作系统》03_day_学习笔记
    《30天自制操作系统》02_day_学习笔记
    《30天自制操作系统》01_day_学习笔记
    湖大OJ-实验D----两个数的互素判定
    湖大OJ-实验B----CFG是P成员
    湖大OJ-实验A---- ADFA的可判定性
    关闭WIN10向微软发送浏览历史
  • 原文地址:https://www.cnblogs.com/moomcake/p/9385639.html
Copyright © 2011-2022 走看看