最长上升序列模型 acwing 1016.最大上升子序列和

简介: 最长上升序列模型 acwing 1016.最大上升子序列和

一个数的序列 ,当  的时候,我们称这个序列是上升的。

对于给定的一个序列,我们可以得到一些上升的子序列,这里。

比如,对于序列(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。

第二行给出序列中的N个整数,这些整数的取值范围都在0到10000(可能重复)。

输出格式

输出一个整数,表示最大上升子序列和。

数据范围

输入样例:

7

1 7 3 5 9 4 8

输出样例:

18

难度:简单
时/空限制:1s / 64MB
总通过数:3427
总尝试数:4486
来源:《信息学奥赛一本通》
算法标签

c++代码

#include
 #include
 using namespace std;
 int main()
 {
     int n;
     cin >> n;
     int a[n];
     int dp[n];
     for (int i = 0; i < n; i++)
     {
         cin >> a[i];
         dp[i] = a[i];
     }
     int maxn = INT_MIN;
     for (int i = 0; i < n; i++) 
     {
         for (int j = 0; j < i; j++) 
         {
             if (a[j] < a[i]) 
             {
                 dp[i] = max(dp[i],dp[j] + a[i]);    
             }
         }
         maxn = max(maxn,dp[i]);
     }
     cout << maxn << endl;
     return 0;
 }

java代码

import java.util.*;
 import java.io.*;
 public class Main{
     public static void main(String[] args) throws IOException{
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
         int n = Integer.parseInt(reader.readLine());
         int[] arr = new int[n];
         int[] dp = new int[n];
         String[] s = reader.readLine().split(" ");
         for (int i = 0; i < n; i++) {
             arr[i] = Integer.parseInt(s[i]); 
             dp[i] = arr[i];
         }
         int max = Integer.MIN_VALUE;
         for (int i = 0; i < n; i++) {
             for (int j = 0; j < i; j++) {
                 if (arr[j] < arr[i]) {
                     dp[i] = Math.max(dp[i],dp[j] + arr[i]);                    
                 }
             }
             max = Math.max(dp[i],max);
         }
         writer.write(max + "\n");
         writer.flush();
         writer.close();
         reader.close();
     }
 }


相关文章
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
|
2月前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
166 0
动态规划算法学习二:最长公共子序列
|
2月前
acwing 895 最长上升子序列1
acwing 895 最长上升子序列1
34 3
|
2月前
acwing 896 最长上升子序列II
acwing 896 最长上升子序列II
29 2
|
7月前
|
算法 程序员 索引
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
114 0
|
算法 Java C++
动态规划专题 最长上升序列模型 acwing 1016.最大上升子序列和
动态规划专题 最长上升序列模型 acwing 1016.最大上升子序列和
53 0
动态规划专题 最长上升序列模型 acwing 1016.最大上升子序列和
深入理解动态规划算法 | 最长公共子序列LCS
深入理解动态规划算法 | 最长公共子序列LCS
136 0
深入理解动态规划算法 - 最长公共子序列
深入理解动态规划算法 - 最长公共子序列
80 0
|
索引
LeetCode最长序列
LeetCode最长序列
110 0
LeetCode最长序列
|
人工智能 算法
Acwing 896. 最长上升子序列 II
Acwing 896. 最长上升子序列 II
89 0

热门文章

最新文章