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


  • 相关阅读:
    [Python]机器学习:Tensorflow实现线性回归
    Python之Numpy:线性代数/矩阵运算
    特殊环境的安装教程[汇总]
    C/C++之编程语言学习资源
    Python之文件操作工具
    NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)
    网络分析:WireShark
    Linux/Window之定时任务脚本编写
    CSS之Background
    JavaScript之iframe页面间通信
  • 原文地址:https://www.cnblogs.com/moomcake/p/9385639.html
Copyright © 2011-2022 走看看