zoukankan      html  css  js  c++  java
  • 09D-最大上升子序列和

    09D:最大上升子序列和

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ...,aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中序列和最大为18,为子序列(1, 3, 5, 9)的和.

    你的任务,就是对于给定的序列,求出最大上升子序列和。注意,最长的上升子序列的和不一定是最大的,比如序列(100, 1, 2, 3)的最大上升子序列和为100,而最长上升子序列为(1, 2, 3)

    输入
    输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000(可能重复)。
    输出
    最大上升子序列和
    样例输入
    7
    1 7 3 5 9 4 8
    
    样例输出
    18
     1 #include<iostream>
     2 #include<string>
     3 #include<algorithm> 
     4 using namespace std;
     5 int a[1005]; 
     6 int d[1005];
     7 int main(){
     8     int n;
     9     cin>>n;
    10     for(int i = 1; i <= n; i++){
    11         cin>>a[i];
    12         d[i] = a[i];
    13     }
    14     int maxx = 0;
    15     for(int i = 1; i <= n; i++){
    16         for(int j = 1; j < i; j++){
    17             if(a[j]<a[i]){
    18                 d[i] = max(d[i], d[j]+a[i]);
    19             }
    20         }
    21     //    cout<<d[i]<<" ";
    22         maxx = max(d[i], maxx);
    23     }
    24     cout<<maxx<<endl;
    25     return 0;
    26 }

    备注:就是最长上升子序列的简单变式。要注意的是d数组要初始化orz 要不然前面没有比a[i]少的数字的话,d[i]就没有被赋值,而不是=a[i]。

  • 相关阅读:
    监控里的主码流和子码流是什么意思
    监控硬盘容量计算
    一个能让你了解所有函数调用顺序的Android库
    电工选线
    oracle linux dtrace
    list all of the Oracle 12c hidden undocumented parameters
    Oracle Extended Tracing
    window 驱动开发
    win7 x64 dtrace
    How to Use Dtrace Tracing Ruby Executing
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/13096336.html
Copyright © 2011-2022 走看看