动态规划专题 最长上升序列模型 acwing 1016.最大上升子序列和

简介: 动态规划专题 最长上升序列模型 acwing 1016.最大上升子序列和

acwing 1016.最大上升子序列和

image.png

比如,对于序列(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(可能重复)。

输出格式

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

数据范围

image.png

输入样例:

7
1 7 3 5 9 4 8

输出样例:

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

c++代码

#include<iostream>
#include<climits>
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();
    }
}


相关文章
【Leetcode -521.最长特殊序列 -541.反转字符串Ⅱ】
【Leetcode -521.最长特殊序列 -541.反转字符串Ⅱ】
31 0
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
|
1月前
acwing 895 最长上升子序列1
acwing 895 最长上升子序列1
28 3
|
1月前
acwing 896 最长上升子序列II
acwing 896 最长上升子序列II
25 2
|
6月前
|
算法 程序员 索引
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
103 0
Acwing 3692. 最长连续公共子序列
Acwing 3692. 最长连续公共子序列
64 0
|
算法 Java C++
最长上升序列模型 acwing 1016.最大上升子序列和
最长上升序列模型 acwing 1016.最大上升子序列和
51 0
|
算法 C++
每日算法系列【LeetCode 128】最长连续序列
每日算法系列【LeetCode 128】最长连续序列
108 0
|
算法 C++
【动态规划篇】最少分割回文 && 编辑距离 && 不同的子序列
【动态规划篇】最少分割回文 && 编辑距离 && 不同的子序列
【动态规划篇】最少分割回文 && 编辑距离 && 不同的子序列