_xiaobai_

导航

2011年8月17日

zoj2972 Hurdles of 110m(DP)

摘要: /*背包类似物:关键是阶段的划分,昨天阶段想错了,其实阶段很明显了,今天调了一段时间,发现数据看错了,╮(╯▽╰)╭按照题目给出的阶段DP。转移方程 : F(i,j) = min( F(i-F1,j)+T1, F( i-1,j )+T2, F(i+F2,j)+T3 ) */View Code 1 #include <iostream> 2 #include <cstdlib> 3 4 using namespace std; 5 6 int F[ 111 ][ 111 ]; 7 int T1[ 111 ]; 8 int T2[ 111 ]; 9 int T3[ 111 阅读全文

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

zoj3321 Circle(搜索)

摘要: /* 简单的搜索,欧拉回路的判断*/View Code 1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 bool maps[ 11 ][ 11 ]; 7 bool used[ 11 ]; 8 9 bool dfs( int n, int s, int d )10 {11 if ( d == n ) return true;12 bool value = false;13 for ( int i = 1 ; i <= n ; ++ i )14 if ( !used[ i 阅读全文

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

zoj3141 nie's Dog Biscuits(DP)

摘要: /*简单的DP:区间动态规划,对于一个m*n的蛋糕只有横竖两类切法 f( m, n ) = min{ f( m, i ) + f( m, n-i ), f( j, n ) + f( m-j, n ) } */View Code 1 #include <stdio.h> 2 3 short F[ 201 ][ 201 ]; 4 5 int main() 6 { 7 for ( int i = 0 ; i <= 200 ; ++ i ) 8 for ( int j = 0 ; j <= 200 ; ++ j ) 9 F[ i ][ j ]= i*j;10 11 for ( 阅读全文

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

zoj2778 Triangular N-Queens Problem(找规律)

摘要: /*分析:三角N皇后问题,找规律题目,按照题目的输出,可以看出构造法则,先填奇数,后填偶数。下面我们只要证明这种构造的存在性即可。解法:先给出集体构造方法,从(1,n-f(n)+1) 开始填充奇数点,填充所有的(1+2k,n-f(n)+1+k){其中f(n)就是最大填充数,1+2k<=n-f(n)+1+k} 之后开始从(2,n-f(n)+1+k+1)开始填充偶数点,由于奇数点只能攻击奇数点,偶数点只能攻击偶数点,所以只要保证每行一个皇后就可以了。 证明: 我们只需要证明从第n-f(n)+1行开始,每行都可以放一个皇后就可以了。 首先,按照上面的构造可知,如此构造,皇后是不可以互相攻击的。 阅读全文

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

zoj2771 Get Out of the Glass(DP)

摘要: /*简单DP:分成奇偶两种状况考虑奇数情况:每个面的光线等于上次的本平面以上的点的反射偶数情况:每个面的光线等于上次的本平面以下的点的反射 */View Code 1 #include <stdio.h> 2 #include <string.h> 3 4 long long F[ 61 ][ 4 ]; 5 6 int main() 7 { 8 int i,j,k,n; 9 memset( F, 0L, sizeof( F ) );10 F[ 0 ][ 0 ] = 1L;11 12 for ( i = 1 ; i <= 60 ; ++ i )13 for ( j 阅读全文

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

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) 编辑