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])


  • 相关阅读:
    14_最长公共前缀_字符串_简单
    5. 最长回文子串_字符串_中等
    187. 重复的DNA序列_字符串_中等
    lr_bn_batchsize_deformable convolution_Hard negative mining
    彻底搞懂HTTPs的加密原理
    20. 有效的括号_字符串_简单
    13_罗马数字转整数_字符串_简单
    202_快乐数_数组_简答
    组件
    World
  • 原文地址:https://www.cnblogs.com/moomcake/p/9385639.html
Copyright © 2011-2022 走看看