zoukankan      html  css  js  c++  java
  • 【算法】简单动态规划——三逆数的O(N^2)解法!

    问题描述:

    三逆数定义:给一个数的序列A[0,1,....N-1]),当i<j<k且A[i]>A[j]>A[k]时,称作ai,aj,ak为一个三逆数。

    现在给定一个长度为N的数组,求此数组序列中存在三逆数的总个数。

    本人暂时只想到O(N^2)时间复杂度的解法。不知道还没有没更好更快的解法。(谁有更好的解法,欢迎分享~)

    O(N^3)解法: 这个最直观了,直接三层循环进行统计,即可求和三逆数总和。代码太简单了,就略过了~

    O(N^2)解法:

    1.进行预处理,先用R[1..N]数组记录,R[i]表示在第i个元素后面比第i个元素小的个数之和,此步为基本的动态规划,时间复杂度为O(N^2)。

    for(int i = 0; i< N; ++i) R[i] = 0;
    for(int i = N-2; i>= 0; i--)
    {
      for(int j = i+1; j <N; ++j)
      {
        if(A[i] > A[j])  { R[i] = max(R[i], R[j]+1); } 
      }
    }

    2.二层循环枚举每两个元素,并进行累加求总和。

    1 for(int i = 0; i< N; ++i)
    2 {
    3     for(int j = i+1; j< N; ++j)
    4     {
    5      ans += (A[j] < A[i]) ? 0 : R[j];
    6     }
    7 }

    最后ans就是结果。这步时间也是O(N^2)。

    因此整个解法总的时间复杂度还是O(N^2).

  • 相关阅读:
    【转】高并发情况下的单例模式
    json替换jsonp实现跨域请求
    asp.net学习——Response对象
    DoS攻击
    Java学习笔记-12.传递和返回对象
    Java学习笔记-11.运行期间类型鉴定
    Java学习笔记-10.io流
    java学习笔记-9.违例差错控制
    Java学习笔记-序
    java学习笔记-8.对象的容纳
  • 原文地址:https://www.cnblogs.com/BrainDeveloper/p/3197106.html
Copyright © 2011-2022 走看看