侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 22 条评论

目 录CONTENT

文章目录

【动态规划】最大上升子序列和「动态规划之LIS模型」

GabrielxD
2023-02-10 / 0 评论 / 0 点赞 / 153 阅读 / 586 字
温馨提示:
本文最后更新于 2023-02-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1016. 最大上升子序列和 - AcWing题库


一个数的序列 bib_i ,当 b1<b2<<bSb_1<b_2<…<b_S 的时候,我们称这个序列是上升的。

对于给定的一个序列( a1,a2,,aNa_1,a_2,…,a_N ),我们可以得到一些上升的子序列( ai1,ai2,,aiKa_{i_1},a_{i_2},…,a_{i_K} ),这里 1i1<i2<<iKN1≤i_1<i_2<…<i_K≤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。

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

输出格式

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

数据范围

1N10001 \le N \le 1000

输入样例:

7
1 7 3 5 9 4 8

输出样例:

18

解题

方法一:动态规划

思路

最x上升子序列,但是子序列和。

模板:【动态规划】最长上升子序列

代码

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken();
        int n = (int) in.nval;
        int[] a = new int[n], f = new int[n];
        for (int i = 0; i < n; ++i) {
            in.nextToken();
            a[i] = (int) in.nval;
        }
        for (int i = 0; i < n; ++i) {
            f[i] = a[i]; // 初始化跟着改
            for (int j = 0; j < i; ++j) {
                if (a[j] < a[i]) f[i] = Math.max(f[i], f[j] + a[i]); // 统计和而非数量
            }
        }
        int mx = 0;
        for (int x : f) mx = Math.max(mx, x);
        System.out.println(mx);
    }
}
0

评论区