当前位置: 首页 > 知识库问答 >
问题:

有没有办法用nlogn复杂度来解决这个问题

薛焱
2023-03-14

给出一个由N个整数a组成的序列,用a[1],a[2]….a[N]表示。序列中的每个整数都有一个与其相关联的值W[1],W[2]……。W[N]。你必须选择给定数组a的一个子序列,使a中的所有元素都是严格递增的,并且在这个选定的子序列中元素的值之和是最大的。你必须打印这个最大值。

样本输入

2  
4  
1 2 3 4  
100 200 300 400  
3  
4 2 3  
100 30 20   
1000   
100     
public class testing {
    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        int t = scn.nextInt();
        StringBuilder sb = new StringBuilder();
        while (t-- > 0) {
            int n = scn.nextInt();
            int a[] = new int[n];
            long val[] = new long[n];
            for (int i = 0; i < n; i++) {
                a[i] = scn.nextInt();
            }
            for (int i = 0; i < n; i++) {
                val[i] = scn.nextLong();
            }

            long dp[] = new long[n];
            Arrays.fill(dp, Integer.MIN_VALUE);
            dp[0] = val[0];
            for (int i = 1; i < n; i++) {
                for (int j = i - 1; j >= 0; j--) {
                    if (a[j] < a[i]) {
                        dp[i] = Math.max(dp[i], dp[j] + val[i]);
                    }
                }
            }
            long ans = Integer.MIN_VALUE;
            for (long v : dp) {
                ans = Math.max(v, ans);
            }
            sb.append(ans + "\n");
        }
        System.out.println(sb);
    }
}

我因为对比关系而变得很虚弱

约束1<=T<=51<=N<=2000001<=a[i]<=10^9,其中i∈[1...N]1<=w[i]<=10^9,其中i∈[1...N]

共有1个答案

席波娃
2023-03-14

迭代一次,并为小于或等于给定a的a值维护W值之和的treemap,就像在迭代a值时看到的那样。

对于新的a调用LowerEntry(key)方法以获得该新a下面W的和。

记住最大的总和,然后返回。

static int sumIncreasing(int[] a, int[] w) {
    int maxSum = Integer.MIN_VALUE;
    TreeMap<Integer, Integer> sums = new TreeMap<>();
    for (int i = 0; i < a.length; i++) {
        Entry<Integer, Integer> lowerSum = sums.lowerEntry(a[i]);
        int sum = (lowerSum != null ? lowerSum.getValue() + w[i] : w[i]);
        sums.put(a[i], sum);
        for (Entry<Integer, Integer> e; (e = sums.higherEntry(a[i])) != null && e.getValue() <= sum; )
            sums.remove(e.getKey());
        if (sum > maxSum)
            maxSum = sum;
    }
    return maxSum;
}
System.out.println(sumIncreasing(new int[] {1, 2, 3, 4}, new int[] {100, 200, 300, 400}));
System.out.println(sumIncreasing(new int[] {4, 2, 3}, new int[] {100, 30, 20}));

输出

1000
100
 类似资料:
  • 问题内容: 有没有办法使用泛型说“此方法返回”? 当然,我想在子类中重写此方法,因此声明应与一起使用。 这是一个例子: 根本不起作用:我收到“类型不匹配:无法从Base转换为T”。如果我强制使用强制转换,则覆盖将失败。 问题答案: 不,无法表达这一点。只需声明该方法即可返回类的类型。Java具有协变返回类型,因此无论如何您都可以重写方法以返回更特定的类型。 如果您想为此添加一些标记,则可以随时引入

  • 由于没有快速的lambda计算器,我使用上面的策略将非类型化lambda演算的术语编译为Haskell,以便快速计算它们。我对它的性能印象深刻:该程序创建了一个从到的数字列表,并在我的计算机上在不到一秒钟的时间内将它们相加。这比我预期的要快得多--只比Haskell直接等价物慢4倍--并且足以对我的目标有用。但是,请注意,为了满足类型系统的需要,我必须将函数和术语包装在fun/num构造函数下面。

  • 因为这个方法是在运行时执行的,所以需要对它进行测试吗

  • 我们有一个基于netty的网络流量密集型Java应用程序/服务器。 旁注:我主要支持这个应用程序,我没有构建它,所以我不知道它的全部内容。 我们有时会收到此错误,如下所示。以前,我们通常在服务器启动3-4天后收到此错误。现在我注意到,即使在重新启动服务器/应用程序后10-15分钟,我们也会收到此错误。 我不明白这怎么可能。这个错误令人担忧吗?我们如何修复它?我记得过去曾对同一个错误进行过广泛的研究

  • 本文向大家介绍数组有没有length()这个方法? String有没有length()这个方法?相关面试题,主要包含被问及数组有没有length()这个方法? String有没有length()这个方法?时的应答技巧和注意事项,需要的朋友参考一下 答:数组没有length()这个方法,有length的属性。String有有length()这个方法。  

  • 我想知道如何将此Twilio CURL代码转换为RestClient我被困在请求中。我不知道如何格式化它的顺序传递Twilio SID,令牌,从,到和正文短信。 为此: 这是我的代码,现在编译100%,在我运行代码后,我得到一个响应“完成”没有错误消息,也没有在twilio仪表板上的条目,它不会发送短信,任何想法您的帮助将不胜感激。