【算法】简单动态规划——三逆数的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).
作者:Jason Cai
出处:http://www.cnblogs.com/BrainDeveloper/
本文版权归作者(Jason Cai)所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/BrainDeveloper/
本文版权归作者(Jason Cai)所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。