Pku acm 1631 Bridging signals 动态规划题目解题报告(十三)
2008-01-03 01:23
393 查看
http://acm.pku.edu.cn/JudgeOnline/problem?id=1631
这个题目可以转化为最长上升子序列,这样这个题目似乎就和2533 Longest Ordered Subsequence 1887 Testing the CATCHER一样了,迅速写下代码,结果超时!看来只能用O(nlogn)的算法了。
在O(n^2)的算法中:创建一个一维数组array[j],opt[],array[j]表示序列的元素,opt[i]表示以第i个元素结尾的序列中的最长下降子序列,初始化为1,对于一个opt[i],遍历前面的每个元素j,如果array[j]>array[i]且opt[j]>=opt[i],那么opt[j]就要加1,在这里,遍历前面的每个元素j,寻找此前最大的子序列时间复杂度为O(n),如果我们在一个有序的序列中查找此前最大的序列长度,我们就可以用二分查找,时间复杂度就会降为O(logn),总的时间复杂度就会为O(nlogn)。为此,我们增加一个一维数组B,B[i]表示当前序列为i的末尾元素的最小值。例如对于序列:4 2 6 3 1 5 :
构建过程如下:
i=1时,opt[i]=1 B[i]=4(当前为1的序列的末尾元素的最小值)
i=2时,2不大于4,所以opt[i]=1,将B[1]更新为2
i=3时,6大于2,所以opt[i]=1+1,将B[2]更新为6
i=4时,3在2 6之间,所以opt[i]=1+1,将B[2]更新为3
i=5时,1小于2,所以opt[i]=1,将B[1]更新为1
i=6时,5大于3,所以opt[i]=2+1,将B[3]更新为5
opt[6]就是最后的结果。从构建的过程可以容易的证明一下两点:B是递增的。B是当前序列为i的末尾元素的最小值。以上“2不大于4”,“3在2 6之间”等等的判断采用二分查找,所以总的时间复杂度为:O(nlogn),核心的c代码如下:
带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得
这个题目可以转化为最长上升子序列,这样这个题目似乎就和2533 Longest Ordered Subsequence 1887 Testing the CATCHER一样了,迅速写下代码,结果超时!看来只能用O(nlogn)的算法了。
在O(n^2)的算法中:创建一个一维数组array[j],opt[],array[j]表示序列的元素,opt[i]表示以第i个元素结尾的序列中的最长下降子序列,初始化为1,对于一个opt[i],遍历前面的每个元素j,如果array[j]>array[i]且opt[j]>=opt[i],那么opt[j]就要加1,在这里,遍历前面的每个元素j,寻找此前最大的子序列时间复杂度为O(n),如果我们在一个有序的序列中查找此前最大的序列长度,我们就可以用二分查找,时间复杂度就会降为O(logn),总的时间复杂度就会为O(nlogn)。为此,我们增加一个一维数组B,B[i]表示当前序列为i的末尾元素的最小值。例如对于序列:4 2 6 3 1 5 :
i | 1 | 2 | 3 | 4 | 5 | 6 |
array | 4 | 2 | 6 | 3 | 1 | 5 |
opt | 1 | 1 | 2 | 2 | 1 | 3 |
B | 1 | 3 | 5 |
i=1时,opt[i]=1 B[i]=4(当前为1的序列的末尾元素的最小值)
opt | 1 | 1 | 1 | 1 | 1 | 1 |
B | 4 |
opt | 1 | 1 | 1 | 1 | 1 | 1 |
B | 2 |
opt | 1 | 1 | 2 | 1 | 1 | 1 |
B | 2 | 6 |
opt | 1 | 1 | 2 | 2 | 1 | 1 |
B | 2 | 3 |
opt | 1 | 1 | 2 | 2 | 1 | 1 |
B | 1 | 3 |
opt | 1 | 1 | 2 | 2 | 1 | 3 |
B | 1 | 3 | 5 |
for(i=1;i<=n;i++)
{
num = array[i];
left = 1;
right = Blen;
while(left<=right)
{
mid = (left+right)/2;
if(B[mid]<num)
left = mid+1;
else
right = mid-1;
}
opt[i] = left;
B[left] = num;
if(Blen<left)
Blen = left;
if(max<opt[i])
max = opt[i];
}
printf("%d/n",max);
带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得
相关文章推荐
- Pku acm 2081 Recaman's Sequence 动态规划题目解题报告(三)
- Pku acm 1050 To the Max 动态规划题目解题报告(十六)
- Pku acm 1861 NetWork 数据结构题目解题报告(二) ----最小生成树:prim算法&amp;amp;Kruskal算法
- Pku acm 1160 post office 动态规划题目解题报告(十八)
- Pku acm 1469 COURSES 数据结构题目解题报告(十一)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2752 Seek the Name, Seek the Fame数据结构题目解题报告(二十)----kmp算法
- Pku acm 2485 Highways数据结构题目解题报告(三) ----最小生成树:prim算法
- Pku acm 2239 Selecting Courses 数据结构题目解题报告(十二)---- 匈牙利算法求二分图的最大匹配
- Pku acm 1258 Agri-Net数据结构题目解题报告(四) ----最小生成树:prim算法
- Pku acm 1274 The Perfect Stall 数据结构题目解题报告(十三)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2752 Seek the Name, Seek the Fame数据结构题目解题报告(二十)----kmp算法
- Pku acm 1159 Palindrome 动态规划题目解题报告(七)
- Pku acm 3278 Catch That Cow数据结构题目解题报告(五) ----树的BFS
- Pku acm 2536 Gopher II 数据结构题目解题报告(十四)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2771 Guardian of Decency 数据结构题目解题报告(十五)---- 匈牙利算法求二分图的最大匹配
- Pku acm 1163 the Triangle 动态规划题目解题报告(一)
- Pku acm 2192 Zipper 动态规划题目解题报告(九)
- Pku acm 2253 Frogger数据结构题目解题报告(六)—单源最短路径:Dijkstra算法
- Pku acm 1125 Stockbroker Grapevine 数据结构题目解题报告(八)---- 弗洛伊德(floyd)算法
- Pku acm 1611 The Suspects数据结构题目解题报告(九)---- 并查集的应用