| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
这个dp过程对不对?我加了discus说的优化,结果TlE->WAIn Reply To:我的n^3的算法超时, 该如何改进呢?确实想不出n^2的算法 Posted by:navyakula at 2006-02-15 14:42:36 > 使用了滚动数组来减少内存.已经郁闷两天了
> #include <stdio.h>
> #define MAXN 501
> int a[MAXN], b[MAXN];
> int d[2][MAXN][MAXN], cur[2][MAXN][MAXN], path[2][MAXN][MAXN], c[2][MAXN];
> int stack[MAXN], top;
> int m, n;
> int p1=0, p2=1;
> void print_rev( int t )
> {
> if( path[p1][n][t] != 0) print_rev( path[p1][n][t] );
> printf("%d ", a[t]);
> }
> void print()
> {
>
> int t = cur[p1][n][c[p1][n]];
> top = 0;
> while( t )
> {
> stack[top++] = a[t];
> t = path[p1][n][t];
> }
> while( top )
> {
> printf("%d ", stack[--top]);
> }
> putchar('\n');
> }
> int main()
> {
> // freopen("2127.in", "r", stdin);
> int i, j;
> scanf("%d", &m);
> for(i=1; i<=m; ++i) scanf("%d", &a[i]);
> scanf("%d", &n);
> for(j=1; j<=n; ++j) scanf("%d", &b[j]);
> for(i=1; i<=m; ++i)
> {
> int k;
> for(j=1; j<=n; ++j)
> {
> if( a[i] == b[j]) // 发现了公共元素
> {
> c[p2][j] = c[p1][j-1];
> for(k=1; k<=m; ++k)
> {
> d[p2][j][k] = d[p1][j-1][k];
> cur[p2][j][k] = cur[p1][j-1][k];
> path[p2][j][k] = path[p1][j-1][k];
> }
>
> int lo, hi, mid;
> lo = 1; hi = c[p2][j];
> while( lo <= hi)
> {
> mid = ( lo + hi ) >> 1;
> if( a[i] > d[p2][j][mid] ) lo = mid + 1;
> else hi = mid - 1;
> }
> d[p2][j][lo] = a[i];
> cur[p2][j][lo] = i;
> if( lo > 1 ) path[p2][j][i] = cur[p2][j][lo-1];
> else path[p2][j][i] = 0;
> if( lo > c[p2][j] ) c[p2][j]++;
> }
> else
> {
> if( c[p2][j-1] >= c[p1][j] )
> {
> c[p2][j] = c[p2][j-1];
> for(k=1; k<=m; ++k)
> {
> d[p2][j][k] = d[p2][j-1][k];
> cur[p2][j][k] = cur[p2][j-1][k];
> path[p2][j][k] = path[p2][j-1][k];
> }
> }
> else
> {
> c[p2][j] = c[p1][j];
> for(k=1; k<=m; ++k)
> {
> d[p2][j][k] = d[p1][j][k];
> cur[p2][j][k] = cur[p1][j][k];
> path[p2][j][k] = path[p1][j][k];
> }
> } // end else
> }// end else
> }
> int t = p1; p1 = p2; p2 = t; // 数组滚动
> }
> printf("%d\n", c[p1][n]);
> print();
> //print_rev( cur[p1][n][c[p1][n]]) ;
> // putchar('\n');
> return 0;
> }
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator