简单动态规划——三逆数的O(N^2)解法!
2013-07-18 11:31
155 查看
【算法】简单动态规划——三逆数的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).
相关文章推荐
- 【算法】简单动态规划——三逆数的O(N^2)解法!
- 【算法】简单动态规划——三逆数的O(N^2)解法!
- 简单动态规划——三逆数的O(N^2)解法!
- Leetcode第303 Range Sum Query - Immutable(简单动态规划解法)
- leetcode 198House Robber(简单动态规划解法)
- 简单谈谈动态规划
- 关于一些简单典型的动态规划
- HDU 2041 超级楼梯 简单DP动态规划 递归
- HDU 1176 免费馅饼 好像是简单的动态规划吧
- 一个简单的动态规划问题
- Combination Sum IV中两种JAVA动态规划解法的不同
- 动态规划的一个简单实例java
- 【练习09】简单动态规划 1006 数塔
- 合唱队问题的动态规划解法
- HDU 2084 数塔 (C++) (简单的动态规划)
- 0-1背包问题的动态规划解法为什么是NPC问题?
- Predict the Winner一个动态规划的问题解法详解
- 上台阶 简单动态规划 或者 用循环
- POJ1050 To the Max 简单动态规划
- 增强学习(三)----- MDP的动态规划解法