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


  • 相关阅读:
    UItableView的cell重用机制
    iOS开发中常遇到的面试题
    iOS UIScrollView 的基本用法
    iOS的CocoaPods手动挡到自动挡到导入第三方框架 转发
    iOS之NSPredicate(正则表达式和UIBarController):谓词
    iOS UISearchController 搜索框
    PHP 基本用法及基本知识点
    iOS 九宫格的实现
    iOS XML 系统自带的解析方法
    iOS xml文件的解析方式 XMLDictionary,GDataXMLNode,NSXMLParser 转发自徒步天涯
  • 原文地址:https://www.cnblogs.com/moomcake/p/9385639.html
Copyright © 2011-2022 走看看