_xiaobai_

导航

2011年8月17日

zoj2711 Regular Words(DP)

摘要: /*考虑二维的状况:如果 A>=B 则在 F( A-1, B )后面放上A,在F(A,B-1)后面放上BF( A, B ) = F( A, B-1 ) + F( A-1, B ) { A > B }当 A = B 时 也满足 F( A, B ) = F( A, B-1 ) + F( A-1, B ) = F( A, B-1 ) + 0所以有: F( A, B ) = F( A, B-1 ) + F( A-1, B ) { A >= B }考虑三维的状况:F( A,B, C ) = F( A-1, B, C ) + F( A, B-1, C-1 ) + F( A, B , C- 阅读全文

posted @ 2011-08-17 14:26 _xiaobai_ 阅读(212) 评论(0) 推荐(0) 编辑

zoj2402 Lenny's Lucky Lotto Lists(DP)

摘要: /*简单的DP,类似于LIS的求解过程 分析:设状态为 F[ i ][ j ] 表示 以j为结束长度为i的串的个数 F[ i ][ j ] = Sum{ F[ i-1 ][ k ] } ( 2^(i-2) <= k <= j/2 ) 再用S[ i ][ j ]求出长度为i结束不超过j的串的个数就可以了*/View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 5 using namespace std; 6 7 long long F[ 11 ][ 2 阅读全文

posted @ 2011-08-17 14:25 _xiaobai_ 阅读(253) 评论(0) 推荐(0) 编辑

zoj2202 Alphacode(DP)

摘要: /*Fiba数列类似物 F[ n ] = F[ n-1 ] + F[ n-2 ]; 最大值为: Fiba[ 500 ]; 关键:* 一定要注意 0 只能和前面的组成一个 * */View Code 1 #include <stdio.h> 2 #include <string.h> 3 4 using namespace std; 5 6 int F[ 10005 ][ 200 ]; 7 char C[ 10005 ]; 8 9 int number( char a, char b )10 {11 return 10*(a-'0')+b-'0&# 阅读全文

posted @ 2011-08-17 14:22 _xiaobai_ 阅读(252) 评论(0) 推荐(0) 编辑

zoj2180 City Game(DP/数据结构)

摘要: /*zju1985升级版 ^_^ 继上次那道题想了一天,本来想用O(N^2)的最大正方形求解,想错了今天仔细一看,其实这道题目就是二维的最大矩形。分析:我们将问题分解成最大矩形,即求解以k行为底边的图形中的最大矩形, 然后将问题合并,求出最大的矩形。 预处理:求出以每行为底边的每一列从底边开始向上的最大高度MaxH。 O(N^2) DP; 对于每一层底边,我们利用单调队列求解出本行的最大矩形。 O(N) 关于单调队列的求解分析,可参照zju1985的题解 总体时间:T(N) = O(N^2)+O(N)*O(N) = O(N^2) */View Code 1 #include <stdio 阅读全文

posted @ 2011-08-17 14:20 _xiaobai_ 阅读(243) 评论(0) 推荐(0) 编辑

zoj2136 Longest Ordered Subsequence(DP)

摘要: /*单调队列优化的最大上升子序列 O(NlogN)算法 */View Code 1 #include <iostream> 2 #include <cstdlib> 3 4 using namespace std; 5 6 int data[ 1002 ]; 7 int Queu[ 1002 ]; 8 9 int BS( int tail, int key )10 {11 int l = 0,h = tail;12 while ( l < h ) {13 int m = (l+h)/2;14 if ( Queu[ m ] > key )15 h = m;16 阅读全文

posted @ 2011-08-17 13:28 _xiaobai_ 阅读(250) 评论(0) 推荐(0) 编辑

zoj1985 Largest Rectangle in a Histogram(DP)

摘要: /*分析:遍历每个木块,如果计算出左边和右边第一块小于当前的值的木块,就可求出最大面积了 O(N*max(find(L),find(R)))如果暴力的话,则find 为O(N) ,则O(N*N) 无法处理100000数据量。但是可用单调队列,做预处理 用O(N) 时间计算出所有点的边界。此时时间复杂度为 O(N)。 每个元素从单调队列中出去的时间就是找到第一个不符合条件的点的时候,两边用0标记作为边界值。 */View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 long long stick[ 100005 阅读全文

posted @ 2011-08-17 13:27 _xiaobai_ 阅读(287) 评论(0) 推荐(0) 编辑

zoj1276 Optimal Array Multiplication Sequence(DP)

摘要: /* 矩阵连乘,区间动态规划 *//*状态:DP[ l ][ s ] ——以 s 开始长度为 l 的区间的 矩阵乘积的最小值 阶段:区间长度 决策:DP[ l ][ s ] = min( DP[ k ][ s ] + DP[ l-k ][ s+k ] + 乘法代价 ) {1<k<l}*/View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 5 using namespace std; 6 7 struct node 8 { 9 int R,C;10 阅读全文

posted @ 2011-08-17 13:26 _xiaobai_ 阅读(197) 评论(0) 推荐(0) 编辑

zoj1095 Humble Numbers(DP)

摘要: /*简单DP:每次将求得的值分别乘以2,3,4,7,然后利用插入排序插入到数据序列中保证数据的递增序,最终到达结束状态。 */View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <stdio.h> 4 5 using namespace std; 6 7 long long data[ 6000 ] = {0,1,2,3,5,7}; 8 9 bool bs( int l, int h, long long key )10 {11 while ( l <= h ) {12 int 阅读全文

posted @ 2011-08-17 13:24 _xiaobai_ 阅读(206) 评论(0) 推荐(0) 编辑

zoj1025 Wooden Sticks(DP)

摘要: /* 问题:求解一个序列中的不上升序列的最小个数:定理:一个序列中的不上升序列的最小个数,是他的最大上升自序列长度。补充:利用单调队列可以是O(N^2)的算法,优化成O(NlogN) */View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct node 5 { 6 int l,w; 7 }stick; 8 9 int BS( int h, int key, int *MUQ )10 {11 int l = 0,m;12 while ( l < h ) {13 m = (l+h) 阅读全文

posted @ 2011-08-17 13:22 _xiaobai_ 阅读(270) 评论(0) 推荐(0) 编辑

测试

摘要: 1 #include <iostream>2 3 using namespace std;4 5 int main()6 {7 cout << "hello world!" << endl;8 return 0;9 } 阅读全文

posted @ 2011-08-17 13:04 _xiaobai_ 阅读(145) 评论(0) 推荐(0) 编辑